c#列表属性初始化模式

本文关键字:模式 初始化 属性 列表 | 更新日期: 2023-09-27 18:11:29

我经常在日常代码中看到这两种初始化模式。我只是在找一个明确的原因,为什么你会选择其中一个而不是另一个,除了偏好?

模式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;}
}

c#列表属性初始化模式

它们本质上是相同的。

只有当你在get或set中做了一些特别的事情时,第一个才有区别,否则第二个更紧凑,更容易阅读。

它们是一回事。第二个是"语法糖",这意味着编译器基本上会为你处理重复的输入。

如果您需要访问后备变量,那么使用第一个。否则,使用第二种方法,让。net框架为您生成支持变量。

虽然,我要说的是,公开IList作为一个公共属性并不总是一个好主意,因为你打开你的类的列表完全修改。如果您只想公开IList的内容,请考虑实现一个枚举器。

模式2正在使用auto属性。如果你不需要访问后备字段,那么就不要放一个进去。你可以稍后再添加。这是一种封装形式。

如果变量需要一个默认值,我通常使用以下模式:

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对象。