Tengo un programa que requiere un rendimiento rápido. Dentro de uno de sus bucles internos, necesito probar el tipo de un objeto para ver si hereda de cierta interfaz.C# 'es' el rendimiento del operador
Una forma de hacerlo sería con la funcionalidad incorporada de comprobación de tipos del CLR. El método más elegante que probablemente ser el 'es' palabra clave:
if (obj is ISpecialType)
Otro enfoque sería dar la clase base de mi propia función GetType virtual() que devuelve un valor de enumeración predefinida (en mi caso, en realidad , solo necesito un bool). Ese método sería rápido, pero menos elegante.
He oído que hay una instrucción IL específicamente para la palabra clave 'es', pero eso no significa que se ejecuta rápidamente cuando se traduce al ensamblaje nativo. ¿Alguien puede compartir alguna información sobre el desempeño de "es" versus el otro método?
ACTUALIZACIÓN: Gracias por todas las respuestas informadas! Parece que hay un par de puntos útiles repartidos entre las respuestas: el punto de Andrew sobre "es" realizar automáticamente un reparto es esencial, pero los datos de rendimiento recopilados por Binary Worrier e Ian también son extremadamente útiles. Sería genial si se editara una de las respuestas para incluir todos de esta información.
por cierto, CLR no le dará la posibilidad de crear su función propia Tipo GetType(), porque rompe una de las reglas principales CLR - verdaderamente tipos – abatishchev
Er, no estoy completamente seguro de lo que quiere decir con la regla de "tipos verdaderos", pero entiendo que el CLR tiene una función GetType() tipo incorporada. Si tuviera que usar ese método, sería con una función de un nombre diferente que devuelva alguna enumeración, por lo que no habría ningún conflicto de nombre/símbolo. – JubJub
Creo que abatishchev significaba "seguridad tipo". GetType() no es virtual para evitar que un tipo mienta sobre sí mismo y, por lo tanto, preserve la seguridad del tipo. –