whats news new microsoft features docs compute c# .net reflection introspection typing

news - new features c#



C#operador "es"-es esa reflexión? (3)

Un colega me hizo una pregunta interesante hoy: ¿es la palabra clave / operador de C # "se" considera una reflexión?

object tmp = "a string"; if(tmp is String) { }

¿Cómo se implementa este operador detrás de escena? ¿Requiere reflexión o introspección? O debido a la naturaleza fuertemente tipada del lenguaje, ¿se puede acceder de inmediato al Tipo del objeto como un atributo de nivel superior del objeto en la memoria?

MSDN declara que:

Tenga en cuenta que el operador solo considera las conversiones de referencia, las conversiones de boxeo y las conversiones de unboxing. Otras conversiones, como las conversiones definidas por el usuario, no son consideradas por el operador is.

La capacidad de considerar conversiones encajonadas y no encajonadas me parece implicar algún tipo de introspección.


El operador is esencialmente determina si un lanzamiento es posible, pero en lugar de lanzar una excepción cuando el lanzamiento es imposible, devuelve false . Si consideras la reflexión de casting, entonces esto también es reflexión.

EDITAR:

Después de algunas investigaciones, descubrí que se realiza un lanzamiento en IL på la instrucción castclass mientras que el operador se asigna a la instrucción isinst . FxCop tiene una rule que le advierte si está haciendo conversiones innecesarias utilizando primero la isinst y luego la instrucción castclass . A pesar de que las operaciones son eficientes, todavía tienen un costo de rendimiento.


Otros idiomas tienen información de tiempo de ejecución suficiente para admitir el lanzamiento dinámico, y sin embargo, nada que pueda describirse como reflexión (C ++ es un ejemplo obvio).

Por lo tanto, la reflexión se refiere a capacidades adicionales más allá de simplemente descubrir el tipo de un objeto. "Reflexionar" sobre un objeto implica la capacidad de caminar sobre sus miembros, por ejemplo.


Haciendo referencia a ECMA-335 , el operador is genera la instrucción IL del modelo de objeto isinst (Partition III §4.6), que forma parte del conjunto de instrucciones base en lugar de ser parte de la biblioteca de Reflection (Partition IV §5.5).

Edición: El operador es extremadamente eficiente en comparación con la biblioteca de reflexión. Básicamente, podría realizar la misma prueba mucho más lentamente a través de la reflexión:

typeof(T).IsAssignableFrom(obj.GetType())

Edición 2: no estás en lo cierto acerca de la eficacia de las instrucciones castclass e isinst (que ahora has editado fuera de la publicación). Están altamente optimizados en cualquier implementación de VM práctica. El único problema de rendimiento real involucrado es el potencial de castclass para lanzar una excepción, que se evita al usar C # as operador y una prueba de null (para tipos de referencia) o el operador is seguido de una conversión (para tipos de valor).