2008-09-17 21 views
13

Nunca he usado ninguno de los genéricos de .NET en mi trabajo, pero entiendo que son bastante populares. ¿Alguien tiene buenos enlaces o sugerencias de libros para aprenderlos? Como un bono; Solo entiendo vagamente qué son las colecciones genéricas de .NET y qué hacen ... ¿Alguien tiene ejemplos prácticos de cómo se podrían usar con mayor ventaja que las colecciones normales en .NET?¿El mejor recurso para aprender genéricos .NET?

Respuesta

5

CLR a través de C# por Jeffrey Richter entra en profundidad acerca de los genéricos, y es uno de los recursos de valor incalculable todos los desarrolladores .NET debe poseer y leer.

1

Si alguna vez ha usado plantillas C++, los genéricos .Net son casi lo mismo. Incluso usan una sintaxis similar a < T>.

Incluso si no conoce ningún C++, probablemente esté haciendo esto más difícil de lo necesario, especialmente con respecto a las colecciones. Son como cualquier otra colección, pero cuando los creas, proporcionas un nombre de tipo dentro de < <> para que el compilador sepa qué tipo de elemento tienen.

0

C# 3.0 in a Nutshell es un libro de referencia fantástico con ejemplos lo suficientemente grandes como para captar el concepto sin sentirse hinchado.

-4

Mi voto es-en su mayoría sólo puede evitarlas :)

La principal ventaja de los genéricos es salvar la fundición, si al final hacer la colada internamente que no tiene ningún sentido. Si trata de analizar este problema, descubrirá que, en su mayoría, los candidatos para genéricos son realmente aquellas colecciones/conjuntos que podrían crear internamente el almacenamiento para tal beneficio. La mayoría de los otros componentes, por otro lado, obtienen poco o ningún rendimiento, y degrada la flexibilidad comparando significativamente con una implementación de herencia de interfaz.

Si la fundición le molesta tanto, tal vez el tiempo para que usted considere lenguajes dinámicos como IronPython :)

Y- si realmente se encuentra con un escenario que cree tiene sentido genérico, que lo ponga como otra cuestión, la cerebros aquí podrían mirar juntos y resolverlo caso por caso :)

Actualización: Sí la verificación del compilador es agradable, pero consulte la fuente de Castle Project, puede ver muchas situaciones donde un tipo genérico se mete en el camino porque no se puede hacer Hacer cosas como IBusinessObject es mucho más flexible que BusinessObject, porque no puedes convertir algo heredado de BusinessObject en BusinessObject y espera acceder a una función n heredado Por lo general, vi que el código terminaba como BusinessObjectBase -> BusinessObject -> Tu clase real. Es por eso que siento que no siempre es beneficioso usar genéricos, y yo fui uno de los que abusó de esa implementación y terminé teniendo toneladas de funciones divertidas con mecanografía genérica, nada agradables.

Actualización # 2: Boxeo/Unboxing solo significa el requisito de lanzar el objeto cuando se usa un tipo abstracto (como objeto) para almacenar el valor y usar un fuerte valor mecanografiado para almacenarlo de nuevo (que requiere conversión), no mucha diferencia puedo ver aparte de la situación de recolección que establecí. Y el código como este todavía lo hace boxeo:

public T GetValue<T>() { 
    return (T) ...; 
} 

Ese es el abuso genérico que he visto más a menudo. La gente piensa que están tratando con tipos nativos aquí, de hecho no lo son. En su lugar, simplemente convierten el casting en sintaxis genérica.Lo que realmente tiene sentido es esto:

public class MyList<T> 
{ 
    private List<T> _list; 
... 
public T GetValue(int index) 
{ 
    return _list[index]; 
} 

Luego, de nuevo, vuelve a nuestro almacenamiento de la colección. Es por eso que dije después del almacenamiento de la colección que no veo muchas posibilidades de que el genérico ayude. Referido de este tutorial: http://en.csharp-online.net/Understanding_Generics—Revisiting_Boxing_and_Unboxing

+1

Usted puede hacer mucho más que sólo colecciones. Y no debes haber oído hablar de 'boxeo'. También hay más que ganar al evitar el reparto que solo el rendimiento. La seguridad del tipo aplicado por compilador es realmente agradable. –

0

He encontrado Genéricos Profesional .NET 2.0 de WROX muy útil ya que contiene una gran cantidad de ejemplos del mundo real. Los genéricos pueden ser confusos para los principiantes, pero podrían ser una herramienta muy útil/potente/de ahorro de tiempo en manos de un desarrollador experimentado. Personalmente, creo que .NET Generics es más útil para simplificar la definición y el uso de colecciones. Además, el uso de genéricos podría conducir a un código más eficiente, ya que podría minimizar el impacto en el rendimiento generalmente asociado con las conversiones de tipo boxeo/unboxing.

Cuestiones relacionadas