2012-12-31 69 views
8
string[] _myStrings = { "Hello", "There", "Happy", "Day" }; 

public IEnumerable<string> MyStrings1 
{ 
    get 
    { 
     return new System.Collections.ObjectModel.ReadOnlyCollection<string>(_myStrings); 
    } 
} 

public IEnumerable<string> MyStrings2 
{ 
    get 
    { 
     return from s in _myStrings select s; 
    } 
} 

我看到了一些關於不使用數組作爲公共屬性的討論。 我一直在使用MyStrings2公約。有沒有什麼理由我應該使用MyStrings1而不是?ReadOnlyCollection IEnumerable

+0

[ReadOnlyCollection或IEnumerable用於公開成員集合的可能的重複?](http://stackoverflow.com/questions/491375/readonlycollection-or-ienumerable-for-exposing-member-collections) – nawfal

回答

13

簡而言之:我覺得你的問題是覆蓋着喬恩斯基特一個完美的答案 - ReadOnlyCollection or IEnumerable for exposing member collections?

另外: 你只需模仿AsReadOnly()

public ReadOnlyCollection<Abc> List 
{ 
    get { return new ReadOnlyCollection(list); } 
} 

UPDATE
這不會創建list的副本。 ReadOnlyCollection不會複製數據,它直接在提供的列表上工作。請參閱documentation

一個只讀的集合只是一個包含防止修改集合的包裝的集合;因此,如果對基礎集合進行更改,則只讀集合將反映這些更改。

此構造函數是O(1)操作。

1

直接暴露數組那些使用這意味着他們可以對其進行修改 - 這是違反封裝和數據隱藏的。

這可能是一個問題,當你的類有一些不變量(保證有關它做什麼和數據其持有),因爲它不能做出保證,如果其他類可以改變其內部威利願意不願意。

在多線程環境中,這更是一個問題,因爲而另一個試圖讀取數據的一個線程可以修改數據 - 你可以很容易地在不同的線程得到不一致的數據。