2010-04-26 151 views
4

這裏我有下面的代碼位:返回一個ReadOnlyCollection從方法與一個IList返回類型

private IList<IState> _states = new List<IState>(); 
    private ReadOnlyCollection<IState> _statesViewer; 

    public IList<IState> States { get { return _statesViewer; } } 

相信一般優選的是,返回的接口,而不是具體的類本身,但在本的情況下,不應該設置爲States屬性的返回類型a ReadOnlyCollection

我的圖書館的任何用戶都會認爲你可以用IList做任何事情,如果我這樣設置它,那就意味着添加元素。這是不正確的,我肯定違反了將它作爲IList暴露的合同。

我對這個觀點還有什麼我在這裏失蹤?

回答

6

做任何事情都會讓API變得最清晰。如果調用者只需要枚舉它,則可以將其公開爲IEnumerable<T>,但我不擔心將它公開爲ReadOnlyCollection。你可以只用一個索引和普查員申報過程中的自定義類型(接口或類),

3

如果是我,我會簡單地公開爲

IEnumerable<IState> 
2

IEnumerable<T>爲任何公衆一個不錯的選擇代表序列的屬性。

這是最小的合約可能仍然是一個序列,它可以幫助您保持分離。

它在Linq中爲對象提供了豐富的操作集合,因此您可以爲您的消費者提供大量的功能。

2

對於某些情況我採取IEnumerable<IState>如果人們只允許運行列表。但是,如果我需要一些像索引運算符,Count,Contains,IndexOf等外部世界的內置功能,我會給他們一個ReadOnlyCollection作爲IList,並在文檔中寫入它是隻讀的。

相關問題