C#List属性初始化模式

时间:2013-04-29 01:27:11

标签: c# list design-patterns

我总是看到每天代码中使用的这两种初始化模式。我只是在寻找一个明确的理由,为什么你会选择一个而不是偏好?

模式1

public class School
{
    private List<User> _users;

    public School()
    {
        _users = new List<User>();
    }

    public List<User> Users
    {
        get
        {
            return _users;
        }
        set
        {
            _users = value;
        }
    }
}

模式2

public class School
{
    public School()
    {
        this.Users = new List<User>();
    }
    public List<User> Users { get; set;}
}

5 个答案:

答案 0 :(得分:4)

它们基本相同。如果你在get或set中做任何特别的事情,第一个只会有所不同,否则第二个更紧凑,更容易阅读。

答案 1 :(得分:1)

他们是一回事。第二个是“语法糖”,这意味着编译器基本上会为你重复打字。

答案 2 :(得分:1)

如果您需要访问支持变量,请使用第一个。否则,使用第二个,让.NET框架为您生成支持变量。

虽然,我会说,将IList作为公共财产公开并不总是一个好主意,因为你打开你的班级列表进行全面修改。如果您要做的只是公开IList的内容,请考虑实施enumerator

答案 3 :(得分:0)

模式2使用自动属性。如果您不需要访问支持字段,则不要将其放入。您可以随时添加。这是一种封装形式。

答案 4 :(得分:0)

如果变量需要默认值,通常我使用这种模式:

public class School
{
    private List<User> _users = new List<Users>();
    public List<User> Users
    {
        get
        {
            return _users;
        }
        set
        {
            _users = value;
        }
    }
}

至少在我学习API设计之前。在那之后,通常我使用这种模式(这可能与David Hoerster的回答有关):

public class School
{
    List<User> _users = new List<Users>();
    public IEnumerable<User> Users
    {
        get
        {
            return _users;
        }
        set
        {
            _users.Clean();
            _users.AddRange(value);
        }
    }

    public void AddUser(User user){
      _users.Add(user);
    }
}

一些原因:

  • 我知道该属性具有默认值,而不是跟踪构造函数。
  • 它支持更好的抽象,因为你可以插入除List之外的其他枚举,例如ObservableCollection,甚至是纯数组(User [])

虽然它可能有一些代码味道,但我更喜欢它比拥有一个具体的List对象更好。