初始化列表属性的最佳实践?

时间:2018-04-09 14:32:08

标签: c# initialization

我与我的同事讨论了在对象中初始化列表属性的位置。我的直觉是在构造对象时初始化它们:

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#中有没有办法让它更简洁?

4 个答案:

答案 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;