获取自定义对象列表的正确面向对象方式是什么

时间:2015-03-05 09:46:06

标签: c# class

假设我在外部类中有一个用户对象。然后我想得到所有用户。

我在其他地方读过,应该避免使用静态方法。因此,应该避免使用List<User> usrs = User.GetAllUsers()这样的内容。

因此,最佳做法是

User u = new User();
List<User> usrs = u.GetAllUsers();

为了完全调用一个新的对象列表,必须创建一个新对象并将其放入内存中似乎很愚蠢。

3 个答案:

答案 0 :(得分:1)

通常,您会使用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();

如果您只有一个存储库,您可以争论将存储库设置为静态类。

答案 1 :(得分:0)

默认情况下绝对没有理由避免使用静态方法。他们的目的是揭示可以独立行动并且不需要来自同一逻辑类的任何其他对象数据的方法。

Microsoft大量使用静态方法,例如在System.Math命名空间中: 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 :-)
        }
    }

答案 2 :(得分:-1)

  

我在其他地方读过,应该避免采用静态方法。

静态方法本身并不坏。有许多有效的用例,例如数学助手函数或静态工厂。

但是,有状态静态方法可能会有问题。这些本质上只是伪装的全局变量或单身人士 - 以及所有相关的问题。它们也很难测试。

相关问题