2012-12-31 20 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; 
    } 
} 

Genel özellikler için dizileri kullanma konusunda bazı tartışmalar gördüm. MyStrings2 Sözleşmesini kullanıyorum. Bunun yerine MyStrings1 kullanmamın bir nedeni var mı?ReadOnlyCollection IEnumerable

+0

olası yinelenen [ReadOnlyCollection veya üye koleksiyonlarını sergilemek için IEnumerable?] (Http://stackoverflow.com/questions/491375/readonlycollection-or-ienumerable-for-exposing-member-collections) – nawfal

cevap

13

Ayrıca ReadOnlyCollection or IEnumerable for exposing member collections?

Ben senin soru Jon Skeet tarafından gayet iyi cevap kaplıdır düşünüyorum:
Bu, list'un bir kopyasını oluşturmaz. ReadOnlyCollection, verileri kopyalamaz, doğrudan verilen listede çalışır. Bkz. documentation:

Salt okunur bir koleksiyon, yalnızca koleksiyonun değiştirilmesini engelleyen bir sarıcı içeren bir koleksiyondur; Bu nedenle, temel koleksiyona değişiklikler yapılırsa, salt okunur koleksiyon bu değişiklikleri yansıtır.

Bu kurucu, bir O (1) işlemdir.

1

Diziyi doğrudan kullananlara gösterilmesi, bunların değiştirilebileceği anlamına gelir; bu, kapsülleme ve veri gizlemenin ihlali anlamına gelir.

Bu, sınıfınızın bazı değişmezleri (ne yaptığını ve sahip olduğu verileri garanti eder) olduğunda, diğer sınıfların dahili olarak nilüferlerini değiştirebileceği garanti edilemediği için bir sorun olabilir.

Birden çok iş parçacıklı bir ortamda, bir iş parçacığı, verileri başka bir veri okumaya çalışırken veride değişiklik yapabileceğinden, bu daha da fazla bir konudur - farklı iş parçacıklarında tutarsız verileri kolayca alabilirsiniz. sadece AsReadOnly() taklit edebilir:

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

GÜNCELLEME: - Kısacası