将值分配给属性,该值永远不会返回null

时间:2019-02-20 09:31:02

标签: c# properties

我有一个财产

public static List<int> intItems
{
    get { return _intItems ?? new List<int>(); }
    set { _intItems = value; }
}
private static List<int> _intItems;

这是可靠的,永远不会为空。但是,当我向其Add赋值时,它将不起作用。

intItems.Add(1);
Console.WriteLine(intItems.First()); //indexoutofrangeexception

要执行此操作,我必须先将值分配给私有字段以启用参考访问:

public static List<int> intItems
{
    get
    {
        if (_intItems == null)
        {
            _intItems = new List<int>();
        }
        return _intItems;
    }
    set { _intItems = value; }
}

我的问题是,是否有比12行代码的属性更优雅的方式?我有很多这样的人。

2 个答案:

答案 0 :(得分:1)

惰性加载属性的正常模式是:

private static List<int> _intItems;
public static List<int> IntItems
{
    get => _intItems ?? (_intItems = new List<int>());
    set => _intItems = value;
}

如果您的要求是阻止将人们将该属性设置为null,同时仍然允许人们对其进行设置,则通常的方法是引发异常:

private static List<int> _intItems = new List<int>();
public static List<int> IntItems
{
    get => _intItems;
    set => _intItems = value ?? throw new ArgumentNullException();
}

但是,如果您的要求只是您的属性永远不返回null,那么为什么不这样做:

public static List<int> IntItems { get; } = new List<int>();

答案 1 :(得分:1)

作为canton7答案的替代方法,您可以在null上检查set

private static List<int> _intItems = new List<int>();

public static List<int> intItems {
  get { return _intItems; }
  set { _intItems = value ?? new List<int>(); }
}