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

  • mliskIT

    mliskIT

    29 Mart 2012
  • RickardRick

    RickardRick

    9 Mart 2007
  • ŠĩŗĜŕôŵåɭȍҭҭ

    ŠĩŗĜŕô

    29 Kasım 2009