C# 获取自定义对象列表的正确面向对象方法是什么
假设我在外部类中有一个用户对象。然后我想获得所有用户 我在别处读到过,应该避免使用静态方法。因此,应该避免使用类似于C# 获取自定义对象列表的正确面向对象方法是什么,c#,class,C#,Class,假设我在外部类中有一个用户对象。然后我想获得所有用户 我在别处读到过,应该避免使用静态方法。因此,应该避免使用类似于List usrs=User.GetAllUsers()的调用 因此,最佳做法是这样做吗 User u = new User(); List<User> usrs = u.GetAllUsers(); User u=新用户(); 列出usrs=u.GetAllUsers(); 为了调用一个全新的对象列表,必须创建一个新对象并将其放入内存中,这似乎很愚蠢。通常你会有一
List usrs=User.GetAllUsers()
的调用
因此,最佳做法是这样做吗
User u = new User();
List<User> usrs = u.GetAllUsers();
User u=新用户();
列出usrs=u.GetAllUsers();
为了调用一个全新的对象列表,必须创建一个新对象并将其放入内存中,这似乎很愚蠢。通常你会有一个类似于
用户存储库的东西,它管理你的用户
对象,并负责添加、删除、搜索你的用户
从那里你可以得到你的用户列表。比如:
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);
}
}
如果您只有一个静态类,那么您可能会争论将存储库设置为静态类。默认情况下,绝对没有理由避免使用静态方法。它们的目的是公开可以自行操作且不需要来自同一逻辑类的任何其他对象数据的方法
Microsoft经常使用静态方法,例如在System.Math命名空间中:
在您的示例中,如果您不打算将来向此用户集合添加额外的字段或方法,则可以将GetAllUsers()设置为静态。如果确实需要,最好创建一个表示用户列表的UserCollection
类
public class UserCollection : Collection<User>
{
public IEnumerable GetAll()
{
return this.AsEnumerable();
}
public void MyFutureMethod()
{
//something you might want to do later on :-)
}
}
public类UserCollection:Collection
{
公共IEnumerable GetAll()
{
返回这个.AsEnumerable();
}
public void MyFutureMethod()
{
//稍后您可能要执行的操作:-)
}
}
我在别处读到过,应该避免使用静态方法
静态方法本身并不坏。有许多有效的用例,例如数学辅助函数或静态工厂
但是,有状态的静态方法可能有问题。这些本质上只是全局变量或伪装的单例——以及所有相关问题。它们也很难测试。我不会说它们应该避免。。。很大程度上取决于实际问题是什么这个问题是什么:)您从哪里获得用户
实例?在我看来,您可能需要类似于UserRepository
的东西,从中获取User
对象。我们使用一个业务层,它反过来调用实体框架,然后将类公开给UI层。@LiamHT您可以使用List usrs=User.GetAllUsers()代码>。我不同意验证部分。存储库不应该关心验证问题。@Steve这当然是正确的批评,我只是添加了该方法作为示例,因此我将删除该方法以避免任何混淆。该示例唯一的批评是,对于一种类型,它是一个全新的类,实际上仍然是一个用户。system.math类的全部要点是,它充当具有一般用途的方法。就像一个实用类。据我所知,当您将用户集合视为一个新实体时,创建一个新的usercollection类是有意义的。每个控件都有一个ControlCollection:
public class UserCollection : Collection<User>
{
public IEnumerable GetAll()
{
return this.AsEnumerable();
}
public void MyFutureMethod()
{
//something you might want to do later on :-)
}
}