我想到了一种访问列表属性的巧妙方法:
private List<int> _stages;
public List<int> Stages
{
get
{
return (_stages ?? (_stages = new List<int>())).OrderBy(s => s).ToList();
}
set
{
_stages = value;
}
}
这样即使 Stages
为 null,如果我使用 Stages.Add(1)
,它也会先被初始化,然后再添加值。但是它不起作用,我真的无法弄清楚,因为没有太多要调试的东西。 _stages
被初始化,但无论我调用多少次 Stages.Add(1)
,_stages
仍然是一个空列表。
我错过了什么?
最佳答案
return (_stages ?? (_stages = new List<int>())).OrderBy(s => s).ToList();
这等同于:
var stages = _stages;
if (stages == null)
stages = _stages = new List<int>();
return stages.OrderBy(s => s).ToList();
因此,当您在列表为 null 时正确初始化列表时,您仍然总是返回 .OrderBy(s => s).ToList()
。
Enumerable.ToList()
调用将总是创建一个新列表。
所以 getter 返回的列表是一个新列表,它没有链接到内部支持的 _stages
列表。因此,当您将一个项目添加到列表中时,您是将其添加到已排序的副本中,而不是原始列表中。
您可以通过始终将排序后的列表分配回支持字段来更改此设置,但这仍然会引入每次访问该属性时始终对字段进行排序的开销。并且访问 getter 通常不应该有副作用,所以我会避免这样做。最好在对象上提供一个清晰的 SortStages
方法来实际对列表进行排序。
此外,您应该考虑使用 List.Sort()
就地对列表进行排序,这样您就不会得到新的列表对象。
关于c# - 具有后备属性的列表没有获得附加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39328580/