2012-03-30 13 views
6

Para acomodar las pruebas unitarias y las burlas, se ha convertido en una práctica común declarar métodos y propiedades como virtuales. ¿Hay un impacto en el rendimiento de declarar algo virtual como supuestamente no virtual?Impacto del rendimiento de los métodos virtuales

+0

¿Crees _Diseño para testability_ es sólo hacer todo lo virtual' '' todas las clases y open'? Hmm ... –

+0

@StefanHanke: No veo nada que sugiera que el OP piense que es * solo * eso. –

+0

Sí, no creo que deba hacerse cuando no sea necesario ... Es solo una medida que puede mejorar la capacidad de prueba cuando sea apropiado – TGH

Respuesta

9

En general, la diferencia es que los métodos virtuales se llaman usando Callvirt Opcode, mientras que los métodos virtuales no usan un Call Opcode estándar. Los Opcodes de llamada son definitivamente más rápidos que Callvirt, pero nunca lo he encontrado lo suficientemente sustancial como para justificar tomar decisiones de diseño basadas en esto.

Premature optimization is the root of all evil.

+0

IIRC, el compilador C# utilizará CallVirt para todos los métodos de instancia, independientemente de si son virtuales. De esta forma, el CLR realiza la verificación de nulidad. –

+0

@JohnSkeet ¿Significa eso que al final del día realmente no hay diferencia? – TGH

+0

Buen punto John - tienes razón, a excepción de los métodos de instancia de tipo de valor, creo, para los cuales el compilador emite un Opcodes.Call. – Jeff

1

No, en realidad no.

No es algo que va a notar.

1

No sé los detalles, pero sí sé que usted no tiene que preocuparse de que el 99% de las aplicaciones por ahí.

btw - Si elige simular interfaces en lugar de clases, no necesitará métodos virtuales.

Buena suerte, Tom

+0

Tiene la misma 'penalización' indirecta con una interfaz como método virtual. – leppie

Cuestiones relacionadas