var
es de tipo estático - el compilador y el tiempo de ejecución conocen el tipo - solo le ahorran algo de tipeo ... los siguientes son 100% idénticos:
var s = "abc";
Console.WriteLine(s.Length);
y
string s = "abc";
Console.WriteLine(s.Length);
Todo lo que sucedió fue que el compilador descubrió que s
debe ser una cadena (del inicializador). En ambos casos, sabe (en la IL) que s.Length
significa la string.Length
propiedad (instancia) .
dynamic
es una bestia muy diferente; es más similar a object
, pero con despacho dinámico:
dynamic s = "abc";
Console.WriteLine(s.Length);
Aquí, s
se escribe como dinámico . Que no sabe nada string.Length
, ya que no sabe nada acerca de s
en tiempo de compilación. Por ejemplo, lo siguiente también se compilaría (pero no se ejecutaría):
dynamic s = "abc";
Console.WriteLine(s.FlibbleBananaSnowball);
En tiempo de ejecución (solo), verificaría la FlibbleBananaSnowball
propiedad, no la encontraría y explotaría en una lluvia de chispas.
Con dynamic
propiedades, métodos / operadores / etc. se resuelven en tiempo de ejecución , en función del objeto real. Muy útil para hablar con COM (que puede tener propiedades de tiempo de ejecución solamente), el DLR u otros sistemas dinámicos, como javascript
.