应该永远不会返回null的List属性的C#快捷方式

时间:2017-01-03 13:38:08

标签: c# accessor

为了确保list属性永远不会返回null,我以这种方式声明:

    private IList<Item> _myList;

    [NotNull]
    public IList<Item> MyList
    {
        get { return _myList ?? new List<Item>(); }
        set { _myList = value; }
    }

这有效,但我讨厌语法。考虑到我应该在整个项目中广泛使用这种技术,我正在寻找一种更好的方法来编写这个或更好的解决方案来解决同样的问题。有什么想法吗?

3 个答案:

答案 0 :(得分:5)

这是做到这一点的好方法,但每次MyList是必需的且_myList为空时,您将创建一个新的空列表......所以如果_myList是空的,有人MyList.Add(item);它将不会被添加到正确的列表中。

最好这样做:

private IList<Item> _myList;

[NotNull]
public IList<Item> MyList
{
    get { return _myList ?? (_myList = new List<Item>()); }
    set { _myList = value; }
}

这样,第一次_myList为空时,您创建一个新列表。然后,_myList将不为空。

答案 1 :(得分:0)

  

这有效,但我讨厌语法。

我讨厌返回一个新列表并立即删除它的想法是一个好主意。我认为你应该考虑其他方法来解决这个问题。

返回的值是否真的不可为空?如果是这样,请创建一个正确的实例,而不是在创建它时删除它:

[NotNull]
public IList<Item> MyList
{
    get { return _myList ?? (_myList = new List<Item>()); }
    set { _myList = value; }
}

如果您可以使用可空列表生活,您可能只想简写空检查:

if (list?.Contains(...) ?? false)
{ }

答案 2 :(得分:-1)

从C#6.0开始,您可以初始化使用自动实现字段的属性。这将确保MyList永远不会为空值:

public IList<Item> MyList { get; set; } = new List<Item>();