Pregunta

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 beneficio adicional;Sólo entiendo vagamente qué son las colecciones genéricas de .NET y qué hacen... ¿Alguien tiene algún ejemplo práctico de cómo podrían usarse con mayor ventaja que las colecciones normales en .NET?

Otros consejos

La elección obvia...

Genéricos de MSDN C#

CLR vía C# de Jeffrey Richter profundiza en los genéricos y es uno de los recursos invaluables que todo desarrollador de .NET debería poseer y leer.

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

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

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

Los genéricos profesionales .NET 2.0 de WROX me parecieron muy útiles ya que contiene muchos ejemplos del mundo real.Los genéricos pueden resultar confusos para el principiante, pero pueden ser una herramienta muy útil, potente y que ahorra tiempo en manos de un desarrollador experimentado.Personalmente, considero 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 boxing/unboxing.

Lo mejor es seguir alguna formación de Microsoft sobre el tema.Si buscas libros, lo ideal sería lo siguiente:

http://www.microsoft.com/MSPress/books/9469.aspx

Mi voto es que, en su mayoría, puedes evitarlos :)

La principal ventaja de los genéricos es ahorrar casting, si terminas haciendo casting internamente eso no tiene ningún sentido.Si intenta analizar este problema, descubrirá que la mayoría de los candidatos para genéricos son en realidad aquellas colecciones/conjuntos que podrían crear almacenamiento nativo internamente para tal beneficio.La mayoría de los demás componentes, por otro lado, obtienen poco o ningún rendimiento y degradan significativamente la flexibilidad en comparación con una implementación de herencia de interfaz.

Si el casting te molesta tanto, tal vez sea hora de que consideres lenguajes dinámicos como IronPython :)

Y si realmente te encuentras con un escenario que crees que genérico tiene sentido, publícalo como otra pregunta, los cerebros aquí podrían buscar juntos y resolverlo caso por caso :)

Actualizar:Sí, la verificación del compilador es buena, pero verifique la fuente de Castle Project, puede ver muchas situaciones en las que un tipo genérico se interpone porque no puede realizar la conversión; hacer cosas como IBusinessObject es mucho más flexible que BusinessObject, porque no puede envía algo heredado de BusinessObject a BusinessObject y espera acceder a una función heredada.Por lo general, vi que el código terminaba como BusinessObjectBase -> BusinessObject ->Su clase real.Es por eso que siento que no siempre es beneficioso usar genéricos, y yo fui uno de los que abusó de dicha implementación y terminé teniendo toneladas de funciones divertidas con la escritura genérica, nada agradable.

Actualización #2:Boxing/Unboxing solo significa el requisito de convertir el objeto cuando se usa un tipo abstracto (como un objeto) para almacenar valor y se usa un valor escrito fuerte para almacenarlo nuevamente (lo que requiere conversión), no puedo ver mucha diferencia aparte de situación de cobro que dije.Y un código como este todavía boxea:

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

Ese es el abuso genérico que he visto con más frecuencia.La gente piensa que aquí se trata de un tipo nativo, pero en realidad no es así.En lugar de eso, simplemente convierten la conversión en una 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, volvemos a nuestro almacenamiento de colección.Por eso dije que después del almacenamiento de la colección no veo muchas posibilidades de que los genéricos ayuden.Referido de este tutorial:http://en.csharp-online.net/Understanding_Generics—Revisiting_Boxing_and_Unboxing

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top