c# .net

c# - Typeof(T) vs. Object.GetType() rendimiento



.net (4)

¿Alguien sabe de alguna diferencia entre typeof(T) where T : struct , por ejemplo, vs. t.GetType() where t is a System.Object ?
ILdasm muestra que typeof (T) usa System.Type::GetTypeFromHandle(RuntimeTypeHandle handle) , y el otro es simplemente System.Object::GetType() . Las implementaciones son [MethodImpl(MethodImplOptions.InternalCall)] , por lo que los métodos se definen en código nativo en el CLR. Entonces, me pregunto si alguien está al tanto de alguna razón para preferir una sobre la otra.

EDITAR: Permítame aclarar, estoy más interesado en los casos en los que no parece importar cuál elija, es decir, ¿existe una diferencia de rendimiento o alguna otra razón? ¡Gracias!


Bueno, a veces en código genérico, conoce el tipo de tiempo de compilación de un parámetro de tipo T , sin tener una instancia. Entonces debes usar typeof(T) .

En otras ocasiones, normalmente en un código no genérico, puede interesarle el tipo de tiempo de ejecución de un objeto. Luego usas GetType() .

Entonces, en algunos casos, dependiendo de lo que desee saber o lo que puede consultar, solo tiene una opción.

Y a veces, podrías elegir.


Utiliza typeof cuando quieres información de tiempo de compilación y GetType cuando quieres información de tiempo de ejecución.

Si se encuentra en una situación en la que puede usar cualquiera de los dos, debe usar typeof porque puede resolverse en tiempo de compilación. Esto aclara cuál será el valor del Tipo y (en principio) permite más optimizaciones.

La palabra clave typeof toma un identificador de tipo en tiempo de compilación y le da la instancia de tiempo de ejecución correspondiente de Type:

Type intType = typeof(int); Type stringType = typeof(string); Type objectType = typeof(object); Type genericType = typeof(T); // not permitted: typeof(1), typeof(someVariable)

El método de instancia GetType toma una instancia en tiempo de ejecución y le indica su tipo de tiempo de ejecución exacto:

Type intType = 1.GetType(); // typeof(int) Type objectType = new Object().GetType(); // typeof(object) object x = "test"; Type stringType = x.GetType(); // typeof(string), NOT typeof(object) // not permitted: int.GetType(), string.GetType(), T.getType()

Por lo general, solo necesita usar typeof o GetType cuando escribe algo que hace reflexión, creando árboles de expresiones a mano o usando los terribles métodos de Enum (que toman una instancia de Tipo en lugar de un parámetro de tipo genérico).


GetType() se usa para recuperar el tipo de instancia que en realidad tiene pero typeof() usó para obtener un tipo de instancia, lo que no tiene también. GetType() se resuelve en tiempo de ejecución, mientras que typeof() se resuelve en tiempo de compilación.


typeof se usa cuando desea obtener la instancia de Type representa un tipo específico. GetType proporciona el tipo de tiempo de ejecución del objeto en el que se llama, que puede ser diferente del tipo declarado.

Por ejemplo:

class A {} class B : A {} class Program { static A CreateA() { return new B(); } static void Main() { A a = CreateA(); Console.WriteLine(typeof(A)); // Writes "A" Console.WriteLine(a.GetType()); // Writes "B" } }

En el caso anterior, dentro del método Main , está tratando con instancias de tipo A ; por lo tanto, si te importa el tipo declarado, typeof(A) . Sin embargo, el método CreateA realidad devuelve una instancia de una clase derivada, B , a pesar de declarar la clase base como el tipo de retorno. Si desea obtener información sobre este tipo de tiempo de ejecución, llame a GetType en la instancia devuelta.

Edit : los comentarios de Mehrdad apuntan en la dirección correcta. Aunque typeof emite una llamada GetTypeFromHandle que toma un RuntimeTypeHandle como parámetro, dicho parámetro correspondería al tipo específico cuyo token de metadatos se encuentra en la pila de evaluación. En algunos casos, este token estaría allí implícitamente (debido a la invocación del método actual); de lo contrario, puede ser empujado allí explícitamente llamando a ldtoken . Puedes ver más ejemplos de esto en estas respuestas:

  • Eficiencia del operador de tipo de C # (o cualquiera que sea su representación en MSIL)
  • Generando IL para Arrays 2D

Edición 2 : Si está buscando puntos de referencia de rendimiento, puede consultar la respuesta de Jon Skeet . Sus resultados fueron:

typeof(Test): 2756ms test.GetType(): 3734ms