假设我在一个外部类中有一个用户对象。然后我想获取所有用户。
我在其他地方读到过应该避免使用静态方法。因此应该避免调用类似CCD_ 1的东西。
因此,最好的做法是进行吗
User u = new User();
List<User> usrs = u.GetAllUsers();
为了调用一个全新的对象列表,必须创建一个新对象并将其放入内存,这似乎很愚蠢。
通常你会有一个类似UserRepository
的东西,它管理你的User
对象,并负责添加、删除、搜索等你的用户。
从那里你会得到一个用户列表。类似于:
class UserRepository
{
// if you don't want to expose properties but only access them via method calls...
private List<User> Users { get; }
public UserRepository()
{
// get Users from Database or any other source...
Users = db.Users;
}
public List<User> GetAllUsers()
{
return Users;
}
public void AddUser(User u)
{
Users.Add(u);
}
}
在你的应用程序中,你会做这样的事情:
var userRep = new UserRepository();
var users = userRep.GetAllUsers();
如果您只有一个静态类,那么您可能会争论将存储库设置为静态类。
默认情况下绝对没有理由避免静态方法。它们的目的是公开可以自己操作的方法,而不需要来自同一逻辑类的任何其他对象数据。
微软经常使用静态方法,例如在系统中。数学命名空间:https://msdn.microsoft.com/en-us/library/system.math.aspx
在您的示例中,如果将来不打算向该用户集合添加额外的字段或方法,则可以将GetAllUsers()设置为静态。如果您确实想要这样做,那么最好创建一个代表用户列表的UserCollection
类。
public class UserCollection : Collection<User>
{
public IEnumerable GetAll()
{
return this.AsEnumerable();
}
public void MyFutureMethod()
{
//something you might want to do later on :-)
}
}
我在其他地方读到过应该避免使用静态方法。
静态方法本身并不坏。有许多有效的用例,例如数学辅助函数或静态工厂。
但是,有状态静态方法可能会有问题。这些本质上只是全局变量或伪装的单变量–以及所有相关的问题。它们也很难测试。