属性为只读但成员访问
为什么我可以实现一个只读属性,像这样......属性为只读但成员访问
public IList<object> SelectedItems { get; }
...并仍然能够使用它的成员,如添加,删除等。当我使用该物业?
是不是只能读取“一路下来”?
是不是只能读取“一路下来”?
这不是一个 “只读” 型。这是一个属性,您可以检索该值(
IList<object>
),但不能将该值设置为不同的实例的IList<object>
,因为没有属性设置器。不是。它不是“只读”,而是属性只有一个getter意味着你可以获得价值,但你可以随心所欲地做任何事情。
请注意,我会小心使用“只读”一词。 C#具有不同的含义和专用readonly
关键字,仅适用于字段。这不是C#意义上的“只读”,而是仅提供get操作的属性。
如果你想有一个“只读”列表,一个好的选择是返回ReadOnlyCollection<T>
。例如,如果你的内部类是List<T>
,你可以使用:
public IList<object> SelectedItems { get { return this.selected.AsReadOnly(); } }
如果你要做到这一点,它可能是更好的实际回报ReadOnlyCollection<T>
还有:
public ReadOnlyCollection<object> SelectedItems { get { return this.selected.AsReadOnly(); } }
这方式,用户将不会期望,因此在结果列表上调用.Add()
是安全的。
您可能希望在这里返回一个'ReadOnlyCollection',以便当用户的代码在突变方法上抛出异常时不会混淆用户。 – Servy
我可能无法事先设定实际的SelectedItems,但我仍然可以说SelectedItems.Add(obj);.我的意思是,这看起来不是很简单,因为我添加了一些... – danielovich
@danielovich这就是为什么我建议'ReadOnlyCollection
不,只读不是“一路下来” –