2010-08-21 21 views
13

Jaki jest skuteczniejszy sposób na zwrócenie metod IList<T> lub IEnumerable<T>?IList <T> vs IEnumerable <T>. Co jest bardziej skuteczne IList <T> lub IEnumerable <T>

IEnumerable<T> jest niezmienna kolekcja, ale IList<T> zmienne i zawierają wiele przydatnych metod i właściwości.

Aby rzucić IList<T> do IEnumerable<T> to tylko odwoływać kopia:

IList<T> l = new List<T>(); 
IEnumerable<T> e = l; 

Aby rzucić IEnumerable<T> do List<T> musimy iterację każdy element lub zadzwonić ToList() metoda:

IEnumerable<T>.ToList(); 

lub mogą przechodzić IEnumerable<T> do konstruktora List<T> wykonującego tę samą iterację gdzieś w obrębie jej konstruktora.

List<T> l = new List<T>(e); 

Które przypadki uważasz za bardziej efektywne? Które wolisz bardziej w swojej praktyce?

Odpowiedz

21

Jeśli chodzi o efektywność, oba są interfejsami, więc wydajność będzie zależeć od rzeczywistej klasy betonu, którą wracasz. Jako regułę zawsze powinieneś zwracać typ, który jest najwyższy w hierarchii obiektów, która działa dla użytkowników tej metody. W twoim przypadku IEnumerable<T>. Jeśli konsumenci klasy muszą dodawać elementy, uzyskać dostęp do elementów według indeksu, usuń elementy, które lepiej Ci się przydają, używając IList<T>.

Tak jak zawsze w programowaniu: zależy :-)

+0

Na przykład jeśli wdrożona metoda, która zwraca „IEnumerable ”, a następnie na innym etapie rozwoju i może trzeba dźwignąć „IList ” w które przypadku muszę rzucić "IEnumerable " na "IList ". Mogę również powielić tę metodę, aby utworzyć nową, która zwróci "IList ". Ale nie sądzę, że powielanie to dobry wybór. Ale rzutowanie z "IEnumerable " na "IList " jest tylko kopiowaniem odniesienia w inny sposób "IList " na "IEnumerable " jest to kopia każdego elementu. Ale tworzenie "IList " wymagało więcej zasobów niż tworzenia "IEnumerable ". – Kuncevic

+0

Nie, to są interfejsy. Są to tylko umowy, które nie biorą żadnych zasobów. Tylko konkretne klasy pobierają zasoby. Po wywołaniu metody rozszerzenia 'ToList' na' IEnumerable 'tworzy to po prostu' nową listę 'i podaje wyliczalną do konstruktora. Oczywiście podstawowe elementy nie są duplikowane, więc po prostu tworzysz obiekt, który nie powinien zająć dużo pamięci. Podstawowy przeliczalny jest przechowywany przez odniesienie. –

+1

Tak, zgadzam się, "zawsze zwracaj typ, który jest najwyższy w hierarchii obiektów", to zdecydowanie tak powinno być. Myślę, że jest to odpowiedź na to pytanie. – Kuncevic

Powiązane problemy