我与我的同事讨论了在对象中初始化列表属性的位置。我的直觉是在构造对象时初始化它们:
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");
因为单词是公开的,所以可以从很多地方访问,我觉得第二种做法会导致大量重复的代码,所有那些空检查和列表创建,对我来说感觉“肮脏”。他的方式更好吗?如果是这样,C#中有没有办法让它更简洁?
答案 0 :(得分:1)
在使用属性时,您可以使用属性的get
方法进行检查:
private List<string> list;
public List<string> Words
{
get
{
list = list ?? new List<string>();
return list;
}
}
优点:
null reference
分配给您的列表,这也会阻止null
。list
答案 1 :(得分:0)
我会用这两个世界中最好的:
private List<string> _words;
public List<string> Words
{
get
{
if(_words == null)
_words = new List<string>();
return _words;
}
set
{
_words = value;
}
}
答案 2 :(得分:0)
我建议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());
答案 3 :(得分:0)
随着言词公开,我认为他的方式更安全。
通常情况下,我只会按照您的方式初始化我的列表一次,并且它始终适用于我。但是,鉴于它在这种情况下是公开的,如果有人在其他地方将其设置为null会怎么样?
如果有人这样做,他的方式仍然可行,而你和我这样做的方式会破裂。
老实说,在读完这篇文章后,我很想在公开列表中同时使用这两种做法,但是当我们私有时,我可能只会坚持初始化一次。
至于更简洁的方式,我唯一能想到的是null-coalescing operator ??
:
Words = Words ?? new List<string>();
或者,如果您想在中间某处使用某些内容,请使用conditional operator(通常也称为三元运算符)?:
:
Words = Words == null ? new List<string>() : Words;