我有一个财产
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行代码的属性更优雅的方式?我有很多这样的人。
答案 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>(); }
}