2013-04-29 111 views
1

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

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

我发现第二个更具可读性;你不是吗?此外,我非常重视我的屏幕房地产,所以第二次允许我一次看到更多的代码,这进一步帮助我理解。 – 2013-04-29 01:29:42

+0

是的,我个人使用第二种模式,除非我需要转换后备变量。 – joepour 2013-04-29 01:31:46

回答

4

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

0

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

1

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

1

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

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

0

如果变量需要一个默认值,平时我用这个模式:

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

至少要等到我学会API设计。在那之后,我通常使用这种模式(这可能与大卫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); 
    } 
} 

一些原因:

  • 我immediaetly该酒店有默认值知道,没有跟踪到构造函数。
  • 它支持更好的抽象,因为你可以将除列表以外的其他列举,如的ObservableCollection,甚至纯阵列(用户[])

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