Açığa üyesi koleksiyonları için ReadOnlyCollection veya IEnumerable?
Herhangi bir nedenle eğer arama kodu sadece koleksiyon üzerinde yineleme eğer bir ReadOnlyCollection yerine bir IEnumerable olarak içsel bir koleksiyon ortaya çıkarmak için var mı?
class Bar
{
private ICollection<Foo> foos;
// Which one is to be preferred?
public IEnumerable<Foo> Foos { ... }
public ReadOnlyCollection<Foo> Foos { ... }
}
// Calling code:
foreach (var f in bar.Foos)
DoSomething(f);
Gördüğüm kadarıyla ReadOnlyCollection IEnumerable arayüzü bir alt kümesidir ve kullanıcı toplama değiştirmek için izin vermez. Eğer İEnumberable arabirimi yeterli ise, o zaman kullanmak için. Bu mantığa uygun bir şekilde ya da ben bir şey eksik mi?
Teşekkürler /Erik
CEVAP
(DÜZENLE)
Herhangi bir nedenle eğer arama kodu sadece koleksiyon üzerinde yineleme eğer bir ReadOnlyCollection yerine bir IEnumerable olarak içsel bir koleksiyon ortaya çıkarmak için var mı?
Çağıran kodun ne kadar güvendiğine bağlı. Eğer her şey üzerinde tam kontrol istiyorsan hiç bu üye ve seni arayacakgarantihayır hiç kod kullanın:
ICollection<Foo> evil = (ICollection<Foo>) bar.Foos;
evil.Add(...);
o zaman kesinlikle zararı yok sadece koleksiyon doğrudan dönüş yapılacaktır. Ben genellikle böyle ama biraz daha paranoyak olmaya çalışın.
Sadece . eğer dediğiniz gibi aynı şekilde: ^em>gerekIEnumerable<T>
, neden daha etkili bir şey bağlıyayım ki?
Orijinal cevap
Kullanıyorsanız .NET bir kopyasını yapmak önleyebilirsiniz 3.5,veAtlamak için basit bir telefon kullanarak: basit dökme kaçının
public IEnumerable<Foo> Foos {
get { return foos.Skip(0); }
}
(Basit - Skip
Select/hakkında güzel bir şey sarma, her yineleme için amaçsızca yürütmek için temsilci olduğu için diğer seçenekleri bol vardır.)
Kullanmıyorsanız .NET 3.5 çok basit bir sarıcı aynı şeyi yazabilirsiniz:
public static IEnumerable<T> Wrapper<T>(IEnumerable<T> source)
{
foreach (T element in source)
{
yield return element;
}
}
En iyi yolu Dizisi için IList, IEnumer...
Nasıl olursa IEnumerable null veya boş...
Href JavaScript bağlantıları için özni...
Reset veya özel sürüm kullanmaya Gah i...
Nasıl özel yöntemleri, alanları veya i...