usando tipos parametros objeto metodos genericos generico ejemplos crear c# .net generics

c# - tipos - ¿El mejor recurso para aprender genéricos.NET?



tipos de parametros c# (8)

Encontré WROX''s Professional .NET 2.0 Generics muy útil ya que contiene muchos 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.

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?


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.


CLR a través de C # de Jeffrey Richter profundiza sobre los genéricos, y es uno de los recursos invaluables que todo desarrollador de .NET debe poseer y leer.




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

Incluso si no conoce ningún C ++, probablemente esté haciendo esto más difícil de lo que necesita, 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 tienen.



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

La principal ventaja de los genéricos es guardar el casting, si terminas haciendo un casting interno 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 el casting te molesta tanto, tal vez sea tiempo de que consideres idiomas dinámicos como IronPython :)

Y, si realmente te encuentras con un escenario que crees que tiene sentido genérico, publícalo como otra pregunta, los cerebros aquí podrían verse 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 en las que un tipo genérico se interpone porque no puede hacer castings, como IBusinessObject es mucho más flexible que BusinessObject, porque puede Transmitir 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 -> 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 n. ° 2: Boxeo / Unboxing solo significa el requisito de lanzar el objeto cuando se usa un tipo abstracto (como objeto) para almacenar valor y usar un fuerte valor mecanografiado para almacenarlo de nuevo (lo cual requiere conversión), no hay mucha diferencia que pueda ver aparte de la situación de la colección que dije. Y un código como este todavía tiene 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]; }

Entonces eso es nuevamente de vuelta 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