在属性中初始化列表还是在构造函数中初始化列表?
Initializing lists inside properties vs. in the constructor?
我有一个对象,其属性公开了 List<>
s。我通常在 属性 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()
{
}
}
然而,我的同事通常更喜欢在 class 构造函数中初始化列表,如下所示:
public class Foo
{
public List<bar> BarList { get; set; }
public Foo()
{
BarList = new List<Bar>();
}
}
这两种情况都会阻止 BarList
在初始化之前被访问。由于使用了自动属性,第二个看起来更简洁。不过,第一个似乎是更好的选择,因为列表仅在首次使用时才被初始化。还有其他我应该考虑的因素吗?有这方面的最佳实践吗?
如果您需要节省内存,惰性策略显然更好。如果该内存使用不重要,则急切策略会导致代码更简单。那就更可取了。
总的来说,排除特殊情况是一件好事。内部访问时list字段可以为null可不是什么好事
请注意,代码变得更短,C# 6 更倾向于更短的代码解决方案。
请注意,对于 getter.
的并发执行,惰性版本不是线程安全的
除了我们的回答,还有一个关于这个问题的答案,使用C# 6.0。
其中一项新功能是自动实现属性的初始值设定项。你会写:
public class Foo
{
public List<bar> BarList { get; set; } = new List<bar>();
}
此外,查看新的主构造函数,发现 a programmers.stackexchange article。
此初始化器将在对象初始化时调用。在内存方面consumption/performance,应该等于在构造函数中初始化属性
我有一个对象,其属性公开了 List<>
s。我通常在 属性 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()
{
}
}
然而,我的同事通常更喜欢在 class 构造函数中初始化列表,如下所示:
public class Foo
{
public List<bar> BarList { get; set; }
public Foo()
{
BarList = new List<Bar>();
}
}
这两种情况都会阻止 BarList
在初始化之前被访问。由于使用了自动属性,第二个看起来更简洁。不过,第一个似乎是更好的选择,因为列表仅在首次使用时才被初始化。还有其他我应该考虑的因素吗?有这方面的最佳实践吗?
如果您需要节省内存,惰性策略显然更好。如果该内存使用不重要,则急切策略会导致代码更简单。那就更可取了。
总的来说,排除特殊情况是一件好事。内部访问时list字段可以为null可不是什么好事
请注意,代码变得更短,C# 6 更倾向于更短的代码解决方案。
请注意,对于 getter.
的并发执行,惰性版本不是线程安全的除了我们的回答,还有一个关于这个问题的答案,使用C# 6.0。
其中一项新功能是自动实现属性的初始值设定项。你会写:
public class Foo
{
public List<bar> BarList { get; set; } = new List<bar>();
}
此外,查看新的主构造函数,发现 a programmers.stackexchange article。
此初始化器将在对象初始化时调用。在内存方面consumption/performance,应该等于在构造函数中初始化属性