C#列表属性的快捷方式,该属性不应返回null

C#列表属性的快捷方式,该属性不应返回null,c#,accessor,C#,Accessor,为了确保list属性永远不会返回null,我这样声明它: private IList<Item> _myList; [NotNull] public IList<Item> MyList { get { return _myList ?? new List<Item>(); } set { _myList = value; } } private IList\u myList; [非空

为了确保list属性永远不会返回null,我这样声明它:

    private IList<Item> _myList;

    [NotNull]
    public IList<Item> MyList
    {
        get { return _myList ?? new List<Item>(); }
        set { _myList = value; }
    }
private IList\u myList;
[非空]
公共图书馆
{
获取{return _myList??new List();}
设置{u myList=value;}
}
这是可行的,但我讨厌语法。考虑到我应该在整个项目中广泛使用这项技术,我正在寻找一种更好的方法来编写这篇文章,或者为同一个问题寻找更好的解决方案。有什么想法吗?

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

public IList<Item> MyList { get; set; } = new List<Item>();
public IList MyList{get;set;}=new List();
这是可行的,但我讨厌语法

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

返回的值真的不可为空吗?如果是这样,请创建一个适当的实例,而不是在创建实例时将其丢弃:

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

这是一个很好的方法,但是每次需要
MyList
,并且
\MyList
为空时,您将创建一个新的空列表。。。因此,如果
\u myList
为空,并且有人执行了
myList.Add(item)它将不会添加到右侧列表中

最好这样做:

private IList<Item> _myList;

[NotNull]
public IList<Item> MyList
{
    get { return _myList ?? (_myList = new List<Item>()); }
    set { _myList = value; }
}
private IList\u myList;
[非空]
公共图书馆
{
获取{return}myList???(\u myList=new List());}
设置{u myList=value;}
}

这样,当第一次
\u myList
为空时,您将创建一个新列表。然后,
\u我的列表
将不会为空。

请参见Zohar Peled答案上的注释,这与我的代码非常不同。当支持成员为
空时,调用
.Add()
。OP的代码在这方面有一个重要的bug,因为使用代码的人不知道正在使用的列表会立即被丢弃。所有关于“这将表现不同”的其他答案的讨论似乎都忽略了当前行为已被破坏。@tocqueville,是的,抱歉,修复了,我忘记了新列表中的()项。我测试了它,它正常工作。关于.Add()问题的观点很好,我没有想到这一点。谢谢。C#8引入了复合赋值运算符(??=),使它更简洁:``private IList`u myList;[NotNull]public-IList-MyList{get=>\u-MyList???=new List();set=>\u-MyList=value;}````
private-readonly-IList\u-MyList=new List()
这将确保它永远不会为null如果我错了,请纠正我,但即使您将_-MyList初始化为新列表,这并不意味着它的值以后不能设置为null。@tockville true,它只能在类的构造函数中设置。
private IList<Item> _myList;

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