Neden IEnumerable<T>.ToList<T>() return Listesi<T> yerine IList<T>?
Uzatma yöntemi ToList()
List<TSource>
döndürür. Aynı desen aşağıdaki, ToDictionary()
döner Dictionary<TKey, TSource>
.
Bu yöntemleri IList<TSource>
IDictionary<TKey, TSource>
sırasıyla dönüş değerleri yazın değil neden merak ediyorum. Bu ToLookup<TSource, TKey>
gerçek bir uygulama yerine bir arayüz olarak dönüş değeri tipi yüzünden daha da tuhaf görünüyor.
Bu uzatma yöntemleri dotPeek veya diğer biçimleri kullanarak kaynağına bakarak, (daha kısa olduğundan ToList()
gösterilen) aşağıdaki uygulama görüyoruz:
public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source) {
if (source == null) throw Error.ArgumentNull("source");
return new List<TSource>(source);
}
Neden bu yöntem türü arabirimi belirli bir uygulama ve arayüz olarak dönüş değeri kendisi? Tek değişiklik, dönüş türü olurdu.
IEnumerable<>
uzantıları bu iki olgu dışında imzalarında çok tutarlı, çünkü merak ediyorum. Ben her zaman biraz tuhaf bir düşünce.
Ayrıca, işleri daha da karmaşık hale getirmek için, documentation for ToLookup()
devletler:
Bir göre bir IEnumerable bir Arama oluşturur belirtilen anahtar seçici işlevi.
ama dönüş türü ILookup<TKey, TElement>
.
Edulinq Jon Skeet dönüş türü List<T>
IList<T>
yerine bahseder ama konuyu daha fazla temas etmez.
Kapsamlı bir aramaya cevap vermiştir, işte bu yüzden size soruyorum:
Arayüzleri olarak dönüş değerlerini yazarak değil, arkasında herhangi bir tasarım kararı var, yoksa sadece rastlantı mı?
CEVAP
List<T>
dönen IList<T>
bulunmayan List<T>
Bu yöntem kolayca kullanılan avantaj. Olamaz IList<T>
ile List<T>
ile yapabileceğiniz bir çok şey vardır.
Buna karşılık, Lookup<TKey, TElement>
ILookup<TKey, TElement>
olmayan tek uygun yöntem (ApplyResultSelector
) var, ve muhtemelen zaten bunu kullanarak sonuna kadar.
Her zaman IEnumerable<T> yerine ...
IList virgülle ayrılmış listesi oluştu...
Neden ICollection ve IEnumerable veya ...
Neden kullanın .() AsEnumerable IEnume...
Neden nesne yerine bir işaretçi kendis...