2012-10-03 133 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 '也是有意義的。 –