c# - generic types java
¿Por qué C#y VB tienen genéricos? ¿Qué beneficio brindan? Genéricos, FTW (15)
Aumentan el rendimiento para colecciones que usan tipos de valores, ya que no se requerirá boxeo / desempaquetado. Son mucho más limpios de usar, ya que no tendrá que lanzar un objeto (por ejemplo, usando ArrayList) al tipo deseado, y de la misma manera ayudan a reforzar la seguridad del tipo.
De la Wikipedia :
La programación genérica es un estilo de programación de computadoras en el que los algoritmos se escriben en términos de tipos posteriores a la especificación que luego se instancian cuando es necesario para tipos específicos proporcionados como parámetros y fue creado por Ada, que apareció en 1983. Este enfoque permite escribir funciones o tipos comunes que difieren solo en el conjunto de tipos en que operan cuando se usan, reduciendo así la duplicación.
Los genéricos brindan la capacidad de definir tipos que se especifican más adelante. No tiene que convertir elementos en un tipo para usarlos porque ya están escritos.
¿Por qué C # y VB tienen genéricos? ¿Qué beneficio brindan? ¿Qué beneficios encuentras al usarlos?
¿Qué otras lenguas también tienen genéricos?
C # y VB tienen genéricos para aprovechar el soporte de genéricos en el CLR subyacente (¿o es al revés?). Le permiten escribir código en un lenguaje de tipo estático que puede aplicarse a más de un tipo de letra sin reescribir el código para cada tipo para el que los usa (el tiempo de ejecución lo hará por usted) o de lo contrario usar System.Object y casting everywhere (como si tuviéramos que hacer con ArrayList).
¿Leíste el artículo ?
Estos idiomas también tienen genéricos:
- C ++ (a través de plantillas )
- Ada (a través de plantillas )
- Eiffel
- D (a través de plantillas )
- Haskell
- Java
Considere estas firmas de métodos:
//Old and busted
public abstract class Enum
{
public static object Parse(Type enumType, string value);
}
//To call it:
MyEnum x = (MyEnum) Enum.Parse(typeof(MyEnum), someString);
//New and groovy
public abstract class Enum
{
public static T Parse<T>(string value);
}
//To call it:
MyEnum x = Enum.Parse<MyEnum>(someString);
Mire ma: no hay manipulación del tipo de tiempo de ejecución.
Desde MSDN :
Los genéricos brindan la solución a una limitación en versiones anteriores del tiempo de ejecución de lenguaje común y el lenguaje C # en el que la generalización se logra fundiendo tipos desde y hacia el tipo de objeto universal universal. Al crear una clase genérica, puede crear una colección que sea segura en tiempo de compilación en tiempo de compilación.
Lea el resto de ese artículo para ver algunos ejemplos de cómo los genéricos pueden mejorar la legibilidad y el rendimiento de su código.
El ejemplo común es colecciones. por ejemplo, un conjunto de tipo T, como un método Add (T) y un método T get (). Mismo código, diferentes tipos de colecciones seguras.
C ++, D, Ada y otros tienen plantillas, un superconjunto de genéricos que lo hacen un pequeño error diferente obtener el mismo resultado final (y algo más).
IIRC Java tiene genéricos, pero yo no hago Java.
En Objectivo-C puedes usar protocolos para lograr los objetivos de los genéricos. Sin embargo, dado que el lenguaje está débilmente tipado, generalmente no es tan preocupante como cuando se lucha contra el sistema de tipos para usar una ruta de código para muchos tipos.
Java también tiene genéricos. C ++ tiene plantillas.
Los lenguajes dinámicos como Perl y Javascript no tienen las mismas restricciones de tipo, por lo que obtienen los mismos beneficios con menos trabajo.
La forma más fácil de explicarlo es dar un ejemplo. Digamos que quiere dos tablas hash, una que mapea objetos de tipo cadena para escribir int y otra que mapea objetos de tipo cadena para escribir double. Puede definir Hashtable y luego usar los tipos K y V. Sin genéricos, tendría que usar el tipo ''objeto'' que, además de tener que ser lanzado para ser significativo, abandona la seguridad de tipo. Simplemente crea una instancia de Hashtable y Hashtable y tendrás tus tablas hash con la comprobación de tipos correcta y todo.
La mayor ventaja de los genéricos sobre los tipos no genéricos en C # (no Java, Java es una historia diferente) es que son mucho más rápidos. El JIT genera el mejor código de máquina que puede obtener para un tipo determinado. List<int>
es en realidad una lista de objetos enteros y no enteros que envuelven un int. Esto hace que los tipos genéricos sean asombrosamente rápidos y también escriban seguros, lo que puede ayudarlo a detectar una gran cantidad de errores en el momento de la compilación :)
Los genéricos en .NET son excelentes para colecciones de objetos. Puede definir su tipo de objeto como quiera y poder tener, por ejemplo, una lista sin escribir ningún código para eso, y tener acceso a toda la funcionalidad eficiente de la colección genérica de la lista .NET mientras es seguro para el tipo de letra T. Es Buena cosa.
Los genéricos en .net, al igual que los métodos de heredancia y extensión, permiten la reducción de la duplicación de código. Déjame explicarte a modo de refactorización.
Si todas las clases con un ancestro común tienen un método común, coloque el método común en el ancestro común de las clases (herencia).
Si algunas clases tienen un método común que utiliza un contrato público para lograr algún resultado, convierta el método común en un método de extensión en ese contrato público.
Si algunos varios métodos o clases tienen el mismo código que difiere solo por los tipos sobre los que se actúa (especialmente cuando los detalles del tipo no son relevantes para la operación del método), reúna esos métodos o clases en un genérico.
Los genéricos se basan en el concepto de plantillas en c ++ si usted está familiarizado con ellos.
Es una forma de implementar un algoritmo o estructura de datos pero retrasando el tipo real en el que se usa.
La lista se puede asignar con cualquier tipo de su elección int, cadena e incluso tipos personalizados, el tipo se asigna en la construcción de la lista. Pero podrás usar la lista de operaciones agregar eliminar, etc.
Realmente puede ahorrar un montón de esfuerzo de codificación al acostumbrarse a los genéricos. Y no tiene que insertar y desempaquetar entre los tipos.
Java también tiene genéricos. Se llaman comodines.
Personalmente, soy un gran fanático de los genéricos debido a todo el código que no tengo que escribir.
Probablemente el uso más común para ellos es ArrayLists fuertemente tipado. En .NET 1.1, tendría que lanzar todo desde el objeto al Tipo deseado, o usar algo como CodeSmith para generar una ArrayList fuertemente tipada.
Además, ayudan a disminuir el boxeo . De nuevo, en .NET 1.x, si intenta utilizar una ArrayList con un tipo de valor, terminaría encajonar y desempaquetar los objetos por todas partes. Los genéricos evitan eso al permitirle definir el Tipo, ya sea Referencia o Valor.
También hay otros usos útiles para ellos, controladores de eventos, consultas LINQ, etc.
Personalmente, creo que les permite ahorrar mucho tiempo. Todavía uso .NET Framework 1.1 y cada vez que quiera una colección específica, necesita crear una colección fuertemente tipada implementando CollectionBase. Con Generics, solo necesita declarar su colección como esa List<MyObject>
y ya está hecho.