2009-10-27 15 views
5

Mam klasy o nazwie Produkt w moim obiekcie Business iw innej klasie chcę zwrócić listę obiektów tej klasy. Jakie podejście powinienem użyć?C# Generics: Lista <Object> lub nowa klasa rozszerza Listę <Object>

public static List<Product> GetProductList() { .... } 

lub utworzyć inną klasę w mojej firmie obiektu namspace nazwie ProductList która rozciąga List <Products> następująco:

public class ProductList :List<Products > { .... } 

i używać go tam

public static ProductList GetProductList() { .... } 

Czy jest jakaś różnica między tymi dwoma? Jaka jest alokacja pamięci i wydajność?

Odpowiedz

9

Istnieje niewielki koszt posiadania dodatkowego typu (ProductList), ale nic wielkiego. Ale to zależy od tego, co chcesz zrobić. Pod wieloma względami, ProductList jest nadal zły pomysł, ponieważ wypala List<T> do publicznego interfejsu API, a List<T> nie jest bardzo rozszerzalny (na przykład żadna z metod nie jest virtual). Collection<T> może mieć więcej opcji rozszerzalności.

będę argumentować na rzecz abstrakcji i hermetyzacji:

public static IList<Product> GetProductList() {...} // abstraction; can return 
                // List<Product> if we want 

czyli

public class ProductList : IList<Product> {...} // encapsulation, but need to 
               // add a lot of dull code 

To wstyd, że C# nie sprawiają, że podejście enkapsulacji prosty (myślę "mixins").

Zauważ, że inna sztuczka (czasami odpowiednia, czasem nie) polega na użyciu metod rozszerzających, aby dodać iluzję dodatkowych metod na IList<Product> ... jest to trudna debata, więc wspominam o tym, nie mówiąc: " Zrób to".

+0

public static IList GetProductList() {...} jest metoda, ale co public static ProductList: IList {...} oznacza? – Max

+1

Oznacza to, że mam błąd kopiowania/wklejania ;-p –

+0

Ach, w porządku, już obawiałem się, że w języku C# jest więcej konstrukcji językowych, o których nie wiem jeszcze. ;) – Max

7

Celem leków generycznych było, między innymi, promowanie ponownego użycia kodu. Twoje pierwsze podejście jest bardziej niż właściwe.

Jednorazowe podejście do drugiego podejścia polegało na dodaniu implementacji interfejsów do kolekcji (np. IDisposable), dodaniu dodatkowej funkcjonalności lub serializacji kolekcji do xaml.

0

Ilość przydzielonej pamięci powinna być identyczna, ale druga opcja jest bardziej elastyczna, ponieważ pozwala na dodanie niestandardowych metod do zwróconej listy produktów.

W celu hermetyzacji (lub abstrakcji, dzięki Marc), najlepiej jest zwrócić wartość IList<Product> lub odpowiednio wykonać IList<Product>.

5

Jeśli planujesz dodać funkcje do listy, takie jak wygodniejsze metody wyszukiwania lub zapytania specyficzne dla produktu, zwróć własną klasę ProductList.

Jeśli nie, nie trzeba owijać go własną klasą. Zamiast tego powinieneś zwrócić wartość IList<Product> lub IEnumerable<Product>, im bardziej ogólna, tym lepiej. Zachowuje to ideę zwrócenia listy lub kolekcji produktów, ale nie łączy cię z rzeczywistą implementacją kolekcji (połączoną listą, tablicą, cokolwiek).

2

Jeśli chcesz po prostu wrócić sekwencję produktów i nigdy nie używać żadnych funkcji na liście, którą proponujemy użyć czegoś takiego:

public static IEnumerable<Product> GetProductList() 
0

Osobiście chciałbym przejść z pierwszej sugestii po prostu ponieważ oznacza to, że nie tworzysz nowej klasy. Robię to w ten sposób, ponieważ uniemożliwia to ładowanie klas specjalnych, gdy wystarczy jedna klasa rodzajowa.

public static IList<Product> GetProductList() { .... }

2

Microsoft Analysis Kodeks zaleca pochodzące z Kolekcji < T> zamiast listy < T>.

This blog post wyjaśnia, dlaczego.

Możecie czerpać swoją klasę Odbiór Collection < T> z następujących powodów:

  • Aby dodać dodatkową funkcjonalność niestandardowego

  • narazić COMVisible silnie wpisany klasy zbiórki.

Powiązane problemy