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?
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
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. –
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