2009-08-18 17 views
6

¿Hay alguna razón para utilizar Type parámetros sobre los genéricos, es decir:parámetros de tipo frente a los genéricos

// this... 
void Foo(Type T); 
// ...over this. 
void Foo<T>(); 

Me parece que los genéricos son mucho más útiles ya que proporcionan restricciones genéricas y con C# 4.0, contravariencia y covarianza, así como probablemente otras características que no conozco. Me parece que la forma genérica tiene todas las ventajas, y no tiene aspectos negativos que el primero tampoco comparte. Entonces, ¿hay algún caso donde usarías el primero en su lugar?

Respuesta

8

Absolutamente: cuando no se conoce el tipo hasta el momento de la ejecución. Por ejemplo:

foreach (Type t in someAssembly.GetTypes()) 
{ 
    Foo(t); 
} 

Hacer eso cuando es Foo genérico es un dolor en el trasero. Es factible, pero doloroso.

También permite que el parámetro sea null, lo que puede ser útil en algunas situaciones.

+0

Es también mucho más caro y lento que ver con los genéricos (todas esas llamadas de reflexión no puede ser bonito) –

+2

Absolutamente - aunque el dolor es normalmente más importante para mí :) –

0

Bueno, realmente no son lo mismo en absoluto.

Con el segundo, en realidad tienes una clase del tipo de tiempo de compilación allí (lo que haya pasado por quien sea). Por lo tanto, puede invocar funciones específicas (por ejemplo, si se trata de una interfaz determinada).

En su primer ejemplo, tiene un objeto de clase 'Tipo'. Por lo tanto, deberá determinar qué es y hacer un yeso para hacer algo útil con él.

+0

Exactamente, la segunda forma tiene todo los beneficios de la verificación en tiempo de compilación. Entonces, dado que, entre otras cosas, quería saber si alguna vez hubo una razón para usar la primera. Me doy cuenta de que son diferentes, pero diferentes no significa que una forma no subsuma completamente la necesidad de la otra. –

+0

Bueno, mi punto es que usarás el primero para un propósito totalmente diferente al segundo. Nunca los usaría para lo mismo (es decir, llamar a métodos comunes o realizar acciones 'genéricas' en un tipo de clase determinado). –

1
Foo(someVariable.GetType());  // allowed 

Foo<someVariable.GetType()>(); // illegal 
+0

Creo que ese era el punto de Jon. –

Cuestiones relacionadas