2009-10-27 10 views
5

Tengo una clase llamada Product in my Business object y en otra clase quiero devolver una lista de objetos de esta clase. ¿Qué enfoque debo usar?C# Genéricos: Lista <Object> o nueva clase extends List <Object>

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

o crear otra clase en mi negocio objeto namspace llamada la lista de productos que se extiende List <Products> de la siguiente manera:

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

y utilizarlo allí

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

¿Hay alguna diferencia entre estos dos? ¿Cómo de la asignación de memoria y el rendimiento?

Respuesta

9

Hay una pequeña sobrecarga en tener un tipo adicional (ProductList), pero nada enorme. Pero realmente depende de lo que quiere hacer. En muchos sentidos, ProductList sigue siendo una mala idea, ya que se quema List<T> en la API pública, y List<T> no es muy extensible (ninguno de los métodos son virtual, por ejemplo). Collection<T> podría tener más opciones de extensibilidad.

yo diría en favor de la abstracción o la encapsulación:

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

o:

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

Es una pena que C# no hace que el enfoque de encapsulación sencilla (estoy pensando "mixins").

Tenga en cuenta que otro truco (a veces adecuado, a veces no) sería utilizar métodos de extensión para agregar la ilusión de métodos adicionales en IList<Product> ... este es un debate complicado, así que solo lo menciono, sin decir " hacer esto".

+0

pública estática IList GetProductList() {...} es un método, pero lo que sí la lista de productos public static: IList {...} significa? – Max

+1

Significa que tengo un error de copiar/pegar ;-p –

+0

Ah, está bien, ya temía que haya más construcciones idiomáticas en C# que aún no conozco. ;) – Max

7

El objetivo de los genéricos fue, entre otras cosas, promover la reutilización de código. Su primer acercamiento es más que apropiado.

Las únicas veces que he tomado el segundo enfoque fue cuando tuve que añadir las implementaciones de interfaz a la colección (como IDisposable), agregar funcionalidad extra, o he tenido que serializar la colección de XAML.

0

La cantidad de memoria asignada debe ser idéntico, pero la segunda opción es más flexible, ya que le permite añadir métodos personalizados a la lista de los productos devueltos.

En aras de encapsulación (o abstracción, gracias Marc), que es la mejor práctica para devolver un IList<Product>, o para implementar IList<Product>, respectivamente.

5

Si va a añadir funcionalidad a la lista, como métodos de búsqueda más convenientes o consultas específicas de productos, devuelva su propia clase ProductList.

Si no es así, no hay necesidad de envolverlo con su propia clase. En su lugar, debe devolver un IList<Product> o IEnumerable<Product>, cuanto más genérico, mejor. Esto mantiene la idea de devolver una lista o una colección de productos, pero no lo empareja con la implementación de la colección real (una lista vinculada, una matriz, lo que sea).

2

Si lo que desea es volver la secuencia de los productos y nunca usaría ninguna función en la Lista, sugeriría que usted utilice algo como:

public static IEnumerable<Product> GetProductList() 
0

Personalmente me gustaría ir con su primera sugerencia simplemente porque significa que no estás creando una nueva clase. Lo hago así ya que evita tener muchas clases de propósito especial cuando una clase genérica sería suficiente.

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

2

análisis de código Microsoft recomienda que deriva de la colección de < T> en lugar de Lista < T>.

This blog post explica por qué.

Es posible derivar su propia clase de colección de la colección de < T> por las siguientes razones:

  • Para añadir funcionalidad personalizada adicional

  • Para exponer una clase de colección inflexible de tipos ComVisible.

Cuestiones relacionadas