2008-09-11 10 views
18

Es shown que 'como' el lanzamiento es mucho más rápido que el moldeado con prefijo, pero ¿qué pasa con 'es' reflejo? ¿Qué tan malo es? Como se puede imaginar, buscar 'es' en Google no es tremendamente efectivo.¿Cuáles son las características de rendimiento de la reflexión 'es' en C#?

+2

'is' es muy muy rápido. –

+0

Me doy cuenta de que la fecha no es el único factor determinante en el cierre de las preguntas duplicadas, pero mi pregunta fue publicada, respondida y votada antes de que se publicara la otra pregunta. _It_ es el duplicado, no este. –

Respuesta

19

Hay algunas opciones:

  1. El clásico fundido: Foo foo = (Foo)bar
  2. El as operador de conversión: Foo foo = bar as Foo
  3. El is prueba: bool is = bar is Foo

  1. El fundido clásica necesita para comprobar si bar pueda emitir de manera segura a Foo (rápida), y luego lo ponga en práctica (más lento), o lanzar una excepción (muy lento).
  2. El operador as necesita para comprobar si bar pueda emitir, a continuación, hacer el reparto, o si no se puede lanzar con seguridad, entonces, sólo se vuelve null.
  3. El operador is solo comprueba si bar se puede convertir a Foo y devuelve boolean.

La prueba is es rápida, ya que sólo lo hace la primera parte de una operación de colada completa. El operador as es más rápido que un elenco clásico porque no lanza una excepción si el lanzamiento falla (lo que lo hace bueno para situaciones en las que legítimamente esperas que el lanzamiento falle).

Si sólo necesita saber si la variable bar es una Foo a continuación, utilizar el operador is, PERO, si se va a probar si bar es una Foo, y si es así, entonces lo arrojó , luego debe usar el operador as.

Esencialmente, cada elenco debe hacer el equivalente a una verificación is internamente para comenzar, a fin de garantizar que el elenco sea válido. Por lo tanto, si realiza una verificación is seguida de un molde completo (ya sea un molde as, o con el operador de conversión clásico), efectivamente está haciendo el control is dos veces, lo cual es una pequeña sobrecarga adicional.

+3

El cheque es el más lento, el lanzamiento es muy rápido en los tipos de referencia, porque simplemente devuelve la referencia. –

+0

Esta respuesta me ayudó a tener la idea .. – nawfal

6

"es" es básicamente equivalente al operador de IL "isinst", que ese artículo describe como rápido.

3

Debe ser lo suficientemente rápido como para no importar. Si usted está mirando el tipo de una lo suficientemente objetivo para que tenga un impacto notable en el rendimiento que necesita para reconsiderar su diseño

7

La forma en que aprendí es que esto:

if (obj is Foo) { 
    Foo f = (Foo)obj; 
    f.doSomething(); 
} 

es más lento de lo siguiente:

Foo f = obj as Foo; 
if (f != null) { 
    f.doSomething(); 
} 

¿Es lo suficientemente lento como para importar? Probablemente no, pero es tan simple prestarle atención, que es mejor que lo hagas.

Cuestiones relacionadas