2015-07-20 114 views
5

我有一个对象List<>由属性暴露。我一般初始化属性getter内我的名单如下:在构造函数中初始化属性内的列表?

public class Foo 
{ 
    private List<bar> _barList; 

    public List<bar> 
    { 
     get 
     { 
      if(_barList == null) 
      { 
       _barList = new List<Bar>() 
      } 

      return _barList; 
     } 

     set 
     { 
      _barList = value; 
     } 
    } 

    public Foo() 
    { 
    } 
} 

然而,我的同事们一般喜欢在类的构造函数初始化列表如下:

public class Foo 
{ 
    public List<bar> BarList { get; set; } 

    public Foo() 
    { 
     BarList = new List<Bar>(); 
    } 
} 

两种情况防止BarList从之前被访问它被初始化。由于使用自动属性,第二个看起来更加整齐。第一个看起来好像是一个更好的选择,因为这个列表只在第一次使用时才被初始化。我应该考虑其他因素吗?对此有最佳做法吗?

+2

重要的是确保你班级的状态有效。这两种方法在外部产生相同的结果,但在内部,您的惰性初始化'_barList'可能为null,而当有人试图在类中使用时,构造函数初始化'BarList'不会为null。那么,如果你开始在方程中引入多线程行为,外部结果并不完全相同。 –

+1

这真的是“急切加载”与“懒加载”方法。 –

+1

在这种情况下,它基本上是一种风格(和意见,虽然)的问题。在c#6.0中,你有另一种初始化自动实现的属性的方法,正如[这个SO回答](http://stackoverflow.com/a/40754/1389444)所示。 –

回答

4

如果需要节约内存,懒惰策略显然会更好。如果这种内存使用不重要,那么渴望的策略会产生更简单的代码。这是最好的。

总的来说,消除特殊情况是件好事。对于内部访问,列表字段可以为空并不是一件好事。

请注意,随着C#6将代码更倾向于更短的代码解决方案,代码变得更短。

请注意,惰性版本对于并发执行getter而言不是线程安全的。

3

除了usrs答案之外,在这个问题上还有一个使用C#6.0的答案。

其中一项新功能是自动实现属性的初始值设定项。你会写:

public class Foo 
{ 
    public List<bar> BarList { get; set; } = new List<bar>(); 
} 

而且,看看在新的主构造,发现a programmers.stackexchange article

此初始化器将在对象初始化时调用。在内存消耗/性能方面,它应该等同于在构造函数中初始化属性。

+0

使用此功能时,是在初始化类时初始化的列表,还是C#为您处理“懒惰”初始化?如果是这样,这似乎是迄今为止最好的解决方案! – Ivan

+0

类初始化时(静态构造函数)是不可能的,因为属性是实例成员,所以它必须是对象初始化时间。 –

+0

哎呀,我的意思是说对象,而不是课堂。所以这个功能看起来等同于OP ..中的第二个选项。因为在我的情况下,列表有时不会使用,我想知道如果节省内存可能会使它值得自己写出来。 – Ivan

相关问题