为什么我可以像这样实现只读属性...
public IList<object> SelectedItems { get; }
...并且当我使用该属性时仍然可以使用它的成员,如添加、删除等?
readonly 不应该是 readonly “一直向下”吗?
readonly 不应该是 readonly “一直向下”吗?
这不是“只读”类型。这是一个属性,您可以在其中检索值(IList<object>
),但不能将值设置为不同的实例,IList<object>
因为没有属性设置器。
不,它不是只读的“一直向下”——属性只有一个 getter 的事实意味着你可以获得价值,但你可以用它做任何你想做的事情。
请注意,我会小心使用“只读”一词。C# 有一个不同的、不同的含义和专用的readonly
关键字,它仅适用于fields。这不是 C# 含义中的“只读”,而是仅提供 get 操作的属性。
如果您想要一个“只读”列表,一个不错的选择是返回一个ReadOnlyCollection<T>
. 例如,如果您的内部类是 a List<T>
,您可以使用:
public IList<object> SelectedItems { get { return this.selected.AsReadOnly(); } }
如果您要这样做,最好也实际返回ReadOnlyCollection<T>
:
public ReadOnlyCollection<object> SelectedItems { get { return this.selected.AsReadOnly(); } }
这样,用户就不会期望调用.Add()
结果列表是安全的。