为什么我可以像这样实现只读属性...
public IList<object> SelectedItems { get; }
...当我使用该属性时仍然可以使用其成员,如添加,删除等?
是不是应该只读“完全”?
答案 0 :(得分:12)
是不是应该只读“完全”?
这不是“只读”类型。这是一个可以检索值(IList<object>
)但不能将值设置为IList<object>
的不同实例的属性,因为没有属性设置器。< / p>
没有。它并非只是“一直向下” - 事实上,该物业只有一个吸气剂意味着你可以获得价值,但你可以随心所欲地做任何事情。
请注意,我会小心使用“readonly”这个词。 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()
是安全的。