当为 List 属性(在 C# 中)实现 setter 时,这样写是不是一件坏事:
private List<string> _TheList = new List<string>();
public List<string> TheList
{
get { return _TheList; }
set { _TheList = value; }
}
是不是应该写成:
private List<string> _TheList = new List<string>();
public List<string> TheList
{
get { return _TheList; }
set { _TheList = new List<string>(value); }
}
直到今天,我通常都使用前者,但最近我发现了一些使用后者的代码,看起来这可能是实现它的正确方法。
当对分配给它的外部列表进行更改时,使用前者不会导致 TheList 属性发生更改。例如:
List<string> list = new List<string>();
list.Add("Hello");
var c = new someClass();
c.TheList = list;
使用前者,下面的代码不会破坏对TheList的封装:
list.Clear();
现在c.TheList也是空的,这可能不是我们想要的。然而,使用后一种方法,c.TheList 不会被清除。
最佳答案
Collection properties should be readonly .
Your property should expose a Collection<T>
, not a List<T>
.
编辑:解释:
如果其他代码复制了对该列表的引用(例如 var list = Thingy.TheList
),如果您将该属性设置为不同的列表,它可能会变得困惑。 (它最终会抱着一个孤儿)
通常,很少有理由允许人们将属性指向不同的集合实例。
使用 Collection<T>
而不是 List<T>
允许您拦截对集合的更改并添加验证或维护父字段。 (通过继承 Collection<T>
并覆盖 InsertItem
和其他方法)您甚至可以在不破坏调用代码的情况下在运送库后添加此类逻辑。
关于c# - 列表属性 setter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4400804/