属性是readonly,但成员可访问

时间:2012-10-03 18:21:44

标签: c# .net

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

public IList<object> SelectedItems { get; }

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

是不是应该只读“完全”?

1 个答案:

答案 0 :(得分:12)

  

是不是应该只读“完全”?

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

  2. 没有。它并非只是“一直向下” - 事实上,该物业只有一个吸气剂意味着你可以获得价值,但你可以随心所欲地做任何事情。

  3. 请注意,我会小心使用“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()是安全的。