¿Cuál es la diferencia entre dinámico (C# 4) y var?
Había leído un montón de artículos sobre esa nueva palabra clave que se incluye con C# v4, pero no pude distinguir entre "dinámico" y "var".
Este artículo me hizo pensar en ello, pero todavía no veo ninguna diferencia.
¿Es que puedes usar "var" sólo como variable local, pero dinámica tanto como local como global?
¿Podría mostrar algún código sin palabra clave dinámica y luego mostrar el mismo código con palabra clave dinámica?
var
tiene un tipo estático: el compilador y el tiempo de ejecución conocen el tipo; simplemente le ahorran algo de escritura... 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
debía ser una cadena (del inicializador). En ambos casos, sabe (en IL) que eso s.Length
significa la propiedad (instancia) string.Length
.
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 . No sabe nada string.Length
, porque no sabe nada en s
el momento de la 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 (únicamente), comprobaría la propiedad FlibbleBananaSnowball
, no la encontraría y explotaría en una lluvia de chispas.
Con dynamic
, las 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 solo tiempo de ejecución), DLR u otros sistemas dinámicos, como javascript
.
Las variables declaradas con var se escriben implícita pero estáticamente . Las variables declaradas con dinámica se escriben dinámicamente. Esta capacidad se agregó al CLR para admitir lenguajes dinámicos como Ruby y Python.
Debo agregar que esto significa que las declaraciones dinámicas se resuelven en tiempo de ejecución, las declaraciones var se resuelven en tiempo de compilación.
Voy a explicar la diferencia entre dinámico y var .
dynamic d1;
d1 = 1;
d1 = "http://mycodelogic.com";
Esto funcionará. El compilador puede recrear el tipo de variable dinámica .
Primero crea el tipo como un número entero y luego el compilador recreará el tipo como una cadena
, pero en el caso de var
var v1; // Compiler will throw error because we have to initialized at the time of declaration
var v2 = 1; // Compiler will create v1 as **integer**
v2 = "Suneel Gupta"; // Compiler will throw error because, compiler will not recreate the type of variable
Cuando se utiliza la palabra clave ' var ', el compilador decide el tipo en el momento de la compilación, mientras que cuando se utiliza la palabra clave ' dynamic ', el tipo lo decide el tiempo de ejecución.
Palabra clave ' var ', una variable local fuertemente tipada implícitamente para la cual el compilador puede determinar el tipo a partir de la expresión de inicialización, muy útil al realizar programación LINQ.
El compilador no tiene ninguna información sobre el tipo dinámico de variable. entonces el compilador no mostrará ninguna inteligencia.
El compilador tiene toda la información sobre el valor almacenado del tipo var , por lo que el compilador mostrará inteligencia.
El tipo dinámico se puede pasar como argumento de función y la función también puede devolver el tipo de objeto.
Pero el tipo
var no se puede pasar como argumento de función y la función no puede devolver el tipo de objeto. Este tipo de variable puede funcionar en el ámbito donde se definió.