Liste <T> bir sınıftır ve hem ICollection <T> hem de IEnumerable <T> arabirimlerini uygular . Ayrıca, ICollection <T>, IEnumerable <T> arabirimini genişletir. En azından tüm açılardan değiştirilemezler.
List <T> öğeniz varsa, bu nesnenin ICollection <T> ve IEnumerable <T> arabirimi tarafından uygulanması gereken yöntemleri ve özellikleri uygulaması garantilidir. Derleyici bunu bilir ve bunları bir ICollection <T> veya bir IEnumerable <T> 'ye dolaylı olarak "aşağı" atamanıza izin verilir. Ancak, bir ICollection <T> varsa, kodunuzda bir Liste <T> veya başka bir şey olup olmadığını, belki de bir Sözlük <T> (burada T bir KeyValuePair'dir ) arzu etmek.
ICollection uygulamasının IEnumerable'ı genişlettiğini biliyorsunuz, böylece onu bir IEnumerable'a atabilirsiniz. Ancak yalnızca IEnumerable'ınız varsa, bunun bir Liste olduğu garanti edilmez. Olabilir, ama başka bir şey olabilir. Bir Listeyi <T> örneğin bir Sözlüğe <T> atmaya çalışırsanız, geçersiz bir cast istisnası beklemelisiniz.
Yani "değiştirilebilir" değiller.
Ayrıca, birçok genel arabirim vardır, System.Collections.Generic ad alanında neler bulabileceğinizi kontrol edin .
Düzenleme: Yorumunuzla ilgili olarak, List <T> veya uyguladığı arabirimlerden birini kullanırsanız kesinlikle hiçbir performans cezası yoktur. Yine de yeni bir nesne oluşturmanız gerekir, aşağıdaki kodu kontrol edin:
List<T> list = new List<T>();
ICollection<T> myColl = list;
IEnumerable<T> myEnum = list;
list , myColl ve myEnum hepsi aynı nesneyi gösterir. Bir Liste veya ICollection veya IEnumerable olarak ilan edip etmediğinizden, programın bir Liste oluşturmasını istiyorum. Bunu yazabilirdim:
ICollection<T> myColl = new List<T>();
myColl , çalışma zamanında hala bir Liste.
Bununla birlikte , bu en önemli nokta ... kuplajı azaltmak ve sürdürülebilirliği artırmak için, ister arayüz ister soyut ya da somut bir sınıf olsun, değişkenlerinizi ve yöntem parametrelerinizi mümkün olan en düşük paydayı kullanarak her zaman beyan etmelisiniz.
"PerformOperation" yönteminin ihtiyacı olan tek şeyin öğeleri saymak, biraz çalışma ve çıkış yapmak olduğunu düşünün, bu durumda <T> Listesinde yüzlerce yönteme daha ihtiyacınız yoktur, sadece IEnumerable <T >, aşağıdakiler geçerli olmalıdır:
public void PerformOperation(IEnumerable<T> myEnumeration) { ... }
Bunu yaparak, siz ve diğer geliştiriciler, IEnumerable <T> arabirimini uygulayan bir sınıfın herhangi bir nesnesinin bu yönteme verilebileceğini bilirsiniz. Başka bir geliştiricinin yazdığı bir Liste, Sözlük veya özel koleksiyon sınıfı olabilir.
Aksine, açıkça somut bir Listeye ihtiyacınız olduğunu belirtirseniz (ve gerçek hayatta nadiren olsa da, yine de olabilir), siz ve diğer geliştiriciler bunun bir Liste veya başka bir somut sınıf miras olması gerektiğini bilirsiniz listesinden.