3

为什么我可以像这样实现只读属性...

public IList<object> SelectedItems { get; }

...并且当我使用该属性时仍然可以使用它的成员,如添加、删除等?

readonly 不应该是 readonly “一直向下”吗?

4

1 回答 1

12

readonly 不应该是 readonly “一直向下”吗?

  1. 这不是“只读”类型。这是一个属性,您可以在其中检索值(IList<object>),但不能将值设置为不同的实例IList<object>因为没有属性设置器。

  2. 不,它不是只读的“一直向下”——属性只有一个 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()结果列表是安全的。

于 2012-10-03T18:24:34.557 回答