2017-01-03 29 views
1

为了确保一个列表属性永远不会返回null,我宣布这样说:的列表属性C#快捷方式,不应该返回null

private IList<Item> _myList; 

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

这工作,但我讨厌的语法。考虑到我应该在整个项目中广泛地使用这种技术,我正在寻找一种更好的方式来编写这个或更好的解决方案来解决同一个问题。任何想法?

+0

'私人只读IList _myList =新列表()'这将确保它永不为空 – Ric

+0

纠正我,如果我错了,但即使你初始化_myList作为一个新的列表,这并不意味着它之后不能将值设置为空。 – tocqueville

+0

@tocqueville true,它只能在类的构造函数中设置。 – Ric

回答

4

这是做这件事的好方法,但每次需要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将不会为空。

+0

此代码无效 – tocqueville

+0

关于在支持成员为空时调用'.Add()'的好处。 OP的代码在这方面有一个重大的缺陷,因为消费代码不知道正在使用的列表会立即被丢弃。所有关于“这个行为会有所不同”的其他答案的讨论似乎都忽略了目前的行为已经被打破。 – David

+0

@大卫我没有...... –

0

从C#6.0开始,您可以初始化使用自动实现字段的属性。这将确保MYLIST从来都不是一个空值:

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

请参阅Zohar Peled的回答,这与我的代码非常不同 – tocqueville

0

这工作,但我讨厌的语法。

我讨厌这样的想法,即返回一个新列表并立即删除它是一个好主意。我想你应该试着想办法解决这个问题。

返回值是否真的不可空?如果是这样,创造一个适当的实例,而不是放弃它的那一刻,你创建它:

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

如果你可以用一个可空单的生活,你可能只是想速记空检查:

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