我和我的同事讨论了在哪里初始化对象中的列表属性。我的直觉是在构造对象时初始化它们:
public List<string> Words { get; set; }
public MyClass()
{
Words = new List<string>();
}或者另选地
public List<string> Words { get; set; } = new List<string>();我的同事不喜欢这样做,而是在每次访问列表之前检查它是否为空。
if(MyClass.Words == null) Words = new List<string>();
MyClass.Words.Add("foo");因为Words是公开的,所以它可以从许多地方访问,我觉得第二次练习会导致大量重复的代码,以及所有那些null-check和list的创建,这对我来说感觉很“脏”。他的方式更好吗?如果是这样的话,在C#中有没有办法让它更简洁呢?
发布于 2018-04-09 22:41:04
在使用属性时,您可以在属性的get方法中进行签入:
private List<string> list;
public List<string> Words
{
get
{
list = list ?? new List<string>();
return list;
}
}优势:
null分配给您的列表,并且您的列表不是只读的,这也会阻止null reference。list,而属性中没有该问题
发布于 2018-04-09 22:38:25
我认为这是两全其美的:
private List<string> _words;
public List<string> Words
{
get
{
if(_words == null)
_words = new List<string>();
return _words;
}
set
{
_words = value;
}
}发布于 2018-04-09 22:43:53
我建议List<T> Words是一个只有get访问器的属性(公开非常量字段通常是一种不好的做法),例如(C# 7.0语法)
public List<string> Words => new List<string>();当Words是一个字段时,你很容易发现自己在分配这个字段时遇到了麻烦:
MyClass a = new MyClass();
MyClass b = new MyClass();
...
a.Words = b.Words;
a.Add("abc");
// "abc": a and b share the same list
Console.Write(b.Words.LastOrDefault()); https://stackoverflow.com/questions/49735454
复制相似问题