Kullanılması IReadOnlyCollection<T>
veya IReadOnlyList<T>
yerine yöntem imzası IEnumerable<T>
, sen iterating önce sayımı kontrol etmek gerekebilir veya başka bir nedenden dolayı birden çok kez yinelemek için bu açık hale avantajına sahiptir.
Bununla birlikte, kodlarınızı arabirimleri kullanmak için yeniden düzenlemeye çalışırsanız, örneğin daha dinamik ve dinamik proxy'ye daha kolay hale getirmek için sorunlara neden olacak büyük bir dezavantajı vardır. Kilit nokta, diğer koleksiyonlardan ve bunların ilgili salt okunur arabirimlerinden IList<T>
miras kalmamasıIReadOnlyList<T>
ve benzer şekilde olmasıdır. (Kısacası, bunun nedeni .NET 4.5'in önceki sürümlerle ABI uyumluluğunu korumak istemesidir. Ancak .NET çekirdeğinde bunu değiştirme fırsatını bile almadılar. )
Bu IList<T>
, programın bir bölümünden alırsanız ve programın bir programın beklediği başka bir bölüme iletilmesini IReadOnlyList<T>
istiyorsanız, bunu yapamazsınız demektir! Ancak IList<T>
birIEnumerable<T>
.
Sonunda, IEnumerable<T>
tüm toplama arabirimleri de dahil olmak üzere tüm .NET koleksiyonları tarafından desteklenen tek salt okunur arabirimdir. Kendinizi bazı mimari seçimlerden kilitlediğinizi fark ettiğinizde, başka herhangi bir alternatif sizi ısırmaya geri dönecektir. Bu nedenle, salt okunur bir koleksiyon istediğinizi ifade etmek için işlev imzalarında kullanmak için uygun tür olduğunu düşünüyorum.
( IReadOnlyList<T> ToReadOnly<T>(this IList<T> list)
Altta yatan tür her iki arabirimi de destekliyorsa , her zaman basit olan bir uzantı yöntemi yazabileceğinizi , ancak yeniden düzenleme yaparken IEnumerable<T>
her zaman uyumlu olduğu her yerde manuel olarak eklemeniz gerektiğini unutmayın .)
Her zaman olduğu gibi, bu mutlak değildir, yanlışlıkla çoklu numaralandırmanın felaket olacağı veritabanı ağır kod yazıyorsanız, farklı bir takas tercih edebilirsiniz.