SORU
29 Ocak 2009, PERŞEMBE


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
29 Ocak 2009, PERŞEMBE


(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;
    }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • SelmerSaxMan

    SelmerSaxMan

    24 HAZİRAN 2006
  • Skittles Page

    Skittles Pag

    28 Mart 2011
  • The Fashion Sight

    The Fashion

    22 AĞUSTOS 2011