2012-10-03 67 views
3

为什么我可以实现一个只读属性,像这样......属性为只读但成员访问

public IList<object> SelectedItems { get; } 

...并仍然能够使用它的成员,如添加,删除等。当我使用该物业?

是不是只能读取“一路下来”?

+3

不,只读不是“一路下来” –

回答

12

是不是只能读取“一路下来”?

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

  2. 不是。它不是“只读”,而是属性只有一个getter意味着你可以获得价值,但你可以随心所欲地做任何事情。

请注意,我会小心使用“只读”一词。 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()是安全的。

+0

您可能希望在这里返回一个'ReadOnlyCollection',以便当用户的代码在突变方法上抛出异常时不会混淆用户。 – Servy

+0

我可能无法事先设定实际的SelectedItems,但我仍然可以说SelectedItems.Add(obj);.我的意思是,这看起来不是很简单,因为我添加了一些... – danielovich

+0

@danielovich这就是为什么我建议'ReadOnlyCollection ' - 但是,像Servy提到的那样,返回'ReadOnlyCollection '也是有意义的。 –