¿Cuál es la diferencia entre RuntimeTypeHandle y Type?
-
09-06-2019 - |
Pregunta
¿Y por qué debería usar uno sobre el otro en mi código?
Solución
Precaución:Esta respuesta parece estar desactualizada. Se publicó antes de que .NET 4 estuviera disponible, lo que aparentemente introdujo algunas optimizaciones con respecto a
Type
y por lo tanto dejó obsoleta la información de esta respuesta.Ver esta respuesta más reciente para detalles.
De acuerdo a esta publicación de blog (de 2006) de Vance Morrison, RuntimeTypeHandle
es un tipo de valor (struct
) que envuelve un puntero no administrado, por lo que Type.GetTypeHandle(obj).Equals(anotherHandle)
es más rápido de usar para comparaciones estrictas de "es exactamente el mismo tipo" que obj.GetType().Equals(anotherType)
— este último crea System.Type
casos que, aparentemente, son más pesados.
Sin embargo, también es menos obvio y definitivamente se incluye en la categoría "microoptimización", por lo que si se pregunta cuándo necesita una u otra, probablemente debería usar System.Type.
Otros consejos
En .NET 4.0 Beta 1 RuntimeTypeHandle
solo envuelve RuntimeType
.Parece que todos los beneficios de usarlo como barato Type
el proxy se ha ido.
Evidencia de la afirmación anterior:
- Microsoft Fuente de referencia para el
System.RuntimeTypeHandle
tipo muestra que este tipo es de hecho sólo una envoltura alrededorSystem.RuntimeType
estos días. - Artículo del blog de Sandro Magi de 2013 "CLR:El costo de las pruebas de tipo dinámico" contiene un punto de referencia y una nota final que muestra que los supuestos beneficios de rendimiento de
RuntimeTypeHandle
han desaparecido en .NET 4.