1

我总是在日常代码中看到这两种初始化模式。我只是在寻找一个明确的理由来解释为什么你会选择其中一个而不是偏好?

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

5 回答 5

4

它们本质上是相同的。如果您在 get 或 set 中执行任何特定操作,第一个只会产生影响,否则第二个会更紧凑且更易于阅读。

于 2013-04-29T01:30:09.820 回答
1

他们是一样的东西。第二个是“语法糖”,这意味着编译器基本上会为您处理重复输入。

于 2013-04-29T01:30:55.523 回答
1

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

虽然,我会说将 anIList公开为公共属性并不总是一个好主意,因为您会打开班级列表以进行全面修改。如果您只想公开 的内容IList,请考虑实现一个枚举器。

于 2013-04-29T01:30:57.273 回答
0

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

于 2013-04-29T01:30:27.500 回答
0

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

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

至少在我学习 API 设计之前。之后,通常我使用这种模式(这可能与大卫霍尔斯特的回答有关):

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

于 2013-04-29T01:46:59.313 回答