[C#] Palabra clave dinámica C # - ¿Penalización en tiempo de ejecución?


Answers

Hasta donde yo sé, la respuesta es 3.

Puedes hacerlo:

dynamic x = GetMysteriousObject();
x.DoLaundry();

Como el compilador no hace check en x , compilará este código, asumiendo que usted sabe lo que está haciendo.

Pero esto significa que debe producirse una comprobación adicional en tiempo de ejecución: es decir, examinar el tipo de x , ver si tiene un método DoLaundry que no acepta argumentos y ejecutarlo.

En otras palabras, el código anterior es algo así como hacer esto (no digo que sea lo mismo, solo hacer una comparación):

object x = GetMysteriousObject();

MethodInfo doLaundry = x.GetType().GetMethod(
    "DoLaundry",
    BindingFlags.Instance | BindingFlags.Public
);

doLaundry.Invoke(x, null);

Esto definitivamente no es trivial, aunque eso no quiere decir que puedas ver un problema de rendimiento a simple vista.

Creo que la implementación de la dynamic implica un caché muy lindo detrás de escena que se realiza para usted, de modo que si ejecuta este código de nuevo x es del mismo tipo, se ejecutará mucho más rápido.

Sin embargo, no me dejes a eso. No tengo mucha experiencia con la dynamic ; esto es simplemente cómo entiendo que funcione.

Question

¿Definir una instancia como dinámica en C # significa:

  1. El compilador no realiza la comprobación de tipos en tiempo de compilación, pero la verificación en tiempo de ejecución se lleva a cabo como siempre en todas las instancias.

  2. El compilador no realiza la comprobación de tipos en tiempo de compilación, pero se lleva a cabo la verificación en tiempo de ejecución, a diferencia de otras instancias no dinámicas.

  3. Igual que 2, y esto viene con una penalización de rendimiento (¿trivial? ¿Potencialmente significativo?).




Bueno, la variable está tipada estáticamente para ser del tipo dynamic pero más allá de eso, el compilador no hace ninguna comprobación, hasta donde yo sé.

El enlace de tipo se realiza en tiempo de ejecución y sí, hay una penalización, pero si la única opción es dynamic ¿qué? Si puede resolver el problema usando tipeo estático, hágalo. Una vez dicho esto, el DLR llama al caché del sitio, lo que significa que algunos de los gastos generales se reducen, ya que en algunos casos se puede reutilizar la tubería.