2008-09-19 15 views
6

De Wikipedia:¿Por qué C# y VB tienen genéricos? ¿Qué beneficio brindan? Genéricos, FTW

programación Genérico es un estilo de la programación informática en la que algoritmos están escritos en términos de a-ser-especificados por el posterior tipos que son continuación, crea una instancia cuando sea necesario para tipos específicos provistos como parámetros y fue creado por Ada que apareció en 1983. Este enfoque permite escribir funciones comunes o tipos que difieren solo en el conjunto de tipos en los que operan cuando se usan, , lo que reduce la duplicación.

Los genéricos proporcionan la capacidad de definir los 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é otros idiomas también tienen genéricos?

Respuesta

6

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 se puede aplicar a más de un tipo de tipo sin reescribir el código para cada tipo para el que los usa (o el tiempo de ejecución lo hará por usted) o usar el System.Object y lanzando por todas partes (como tuvimos que hacer con ArrayList).

¿Has leído article?

Estos idiomas también tienen genéricos:

  • C++ (vía plantillas)
  • Ada (a través de plantillas)
  • Eiffel
  • D (a través de plantillas)
  • Haskell
  • Java
+0

Existe alguna diferencia entre los genéricos y las plantillas. C++, Ada y D tienen lo último, no están seguros del resto. – BCS

+2

Las plantillas aún permiten escribir con medicamentos genéricos, además de otras cosas. –

0

El ejemplo común son las colecciones. p.ej. 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.

0

La manera 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.

0

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.

+0

No es el beneficio, ya que no ofrecen ningún tipo de seguridad en absoluto. – Thomas

+0

Hay mucho más beneficio para las colecciones genéricas que la seguridad del tipo. – Wedge

2

De MSDN:

Generics proporcionan la solución a una limitación en versiones anteriores de la tiempo de ejecución de lenguaje común y el lenguaje C# en el que la generalización es conseguido haciendo tipos a y de lo universal tipo base Objeto. Al crear una clase genérica, puede crear una colección que sea segura de tipos 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.

5

Personalmente, creo que 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 listo.

2

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 boxing. 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.

Hay otros usos para referirnos a ellas también, controladores de eventos, consultas LINQ, etc

1

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.

0

En Objectivo-C puede 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.

1

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 usted podrá 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.

1

genéricos en .NET, como inheritence y extensión métodos, permite la reducción de 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 métodos o clases tienen el mismo código que difiere solo por los tipos utilizados (especialmente cuando los detalles del tipo no son relevantes para el funcionamiento del método), recopile esos métodos o clases en un genérico.

1

Aumentan el rendimiento para las 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.

3

Considere estas firmas de método:

//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); 

Look ma: Ninguna manipulación de tipo en tiempo de ejecución.

+0

Me encanta tu comentario sobre look ma. :RE – ferventcoder

1

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 envuelve un int. Esto hace que los tipos genéricos sean asombrosamente rápidos y también que escriban seguros, lo que puede ayudarlo a detectar una gran cantidad de errores en tiempo de compilación :)

Cuestiones relacionadas