属性是readonly,但成员可访问

dan*_*ich 3 .net c#

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

public IList<object> SelectedItems { get; }
Run Code Online (Sandbox Code Playgroud)

...当我使用该属性时,仍然可以使用其成员,如添加,删除等?

是不是应该只读"一路向下"?

Ree*_*sey 12

是不是应该只读"一路下来"?

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

  2. 不.它不是只读"一直向下" - 事实上该物业只有一个吸气剂意味着你可以获得价值,但你可以做任何你想做的事情.

请注意,我要小心使用"readonly"一词.C#具有不同的,不同的含义和专用readonly关键字,仅适用于字段.这在C#意义上不是"只读",而是仅提供get操作的属性.

如果你想要一个"只读"列表,一个很好的选择是返回一个ReadOnlyCollection<T>.例如,如果您的内部类是a List<T>,则可以使用:

public IList<object> SelectedItems { get { return this.selected.AsReadOnly(); } }
Run Code Online (Sandbox Code Playgroud)

如果你打算这样做,那么实际返回也可能更好ReadOnlyCollection<T>:

public ReadOnlyCollection<object> SelectedItems { get { return this.selected.AsReadOnly(); } }
Run Code Online (Sandbox Code Playgroud)

这样,用户就不会期望调用.Add()结果列表是安全的.

  • @danielovich这就是我所说的 - 这不是一个"只读属性",它是一个允许你获取值但不设置值的属性."value"只是`IList <T>`引用,但与该引用中的成员或数据无关. (2认同)
  • 应该注意的是,即使是`ReadOnlyCollection <T>`也不是"一直向下"的只读.因为如果`T`是一些可变类型,你仍然可以改变每个项目对象.对于带有'ReadOnlyCollection <Person>`的例子,你可能会说`person [0] .Surname ="Jones";`从而修改集合中的对象.(这里`Person`必须是引用类型.) (2认同)