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
.
var
pueden inferir tipos que podrían no ser deseables debido a subtipos y conversiones implícitas. Es decir,var
puede haber resuelto un tipo estáticamente diferente de lo esperado cuando ocurren conversiones implícitas (más notablemente a un tipo más general, pero no se limita a esto). Un ejemplo trivial esobject x = ""
vsvar x = ""
vs.var x = "" as object
, pero pueden ocurrir otros casos más astutos (y realistas) y pueden causar errores sutiles.WriteLine
debe llamar. Este "enlace" ocurre en tiempo de compilación. En el caso dedynamic
, el tipo de.Length
tiene que serdynamic
también, y no es hasta el tiempo de ejecución que se decide qué sobrecarga (si es que la hay) seWriteLine
ajusta mejor. El enlace ocurre en tiempo de ejecución.var
palabra clave en Visual Studio, se muestra el tipo real que se infiere. Le muestra que el tipo es conocido en tiempo de compilación.Las variables declaradas con var se tipean implícita pero estáticamente . Las variables declaradas con dinámico 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.
fuente
Voy a explicar la diferencia entre dinámica y var .
Esto funcionará El compilador puede recrear el tipo de variable dinámica .
primero crea el tipo como entero y luego ese compilador recreará el tipo como cadena
pero en caso de var
fuente
var implica que se aplica la comprobación de tipo estático (enlace temprano). dinámico implica que se aplica la verificación de tipo dinámico (enlace tardío). En términos del código, tenga en cuenta lo siguiente:
Si compila esto e inspecciona los resultados con ILSpy, encontrará que el compilador ha agregado un código de enlace tardío que manejará la llamada a Hello () desde b, mientras que el enlace temprano se aplicó a a, a puede llamar a Hello () directamente.
por ejemplo (desmontaje ILSpy)
Lo mejor que puede hacer para descubrir la diferencia es escribirse una pequeña aplicación de consola como esta y probarla usted mismo con ILSpy.
fuente
Una gran diferencia: puede tener un tipo de retorno dinámico.
fuente
Aquí hay un ejemplo simple que demuestra la diferencia entre Dynamic (4.0) y Var
Shiva Mamidi
fuente
**
caracteres en el ejemplo de código tiene la intención de indicar solo énfasis y no pretende ser parte del código de trabajo real.var
es solo una abreviatura de una declaración de tipo normal, donde permite que el compilador adivine el tipo correcto.dynamic
es un nuevo tipo (estático), donde todas las comprobaciones se realizan en tiempo de ejecución, no por el compilador.fuente
El compilador determina el tipo de una variable declarada con var, es un atajo para especificar el nombre del tipo, nada más.
Sin embargo, la dinámica se determina en tiempo de ejecución, el compilador no tiene idea del tipo real y todos los accesos de método / campo / propiedad con esa variable se resolverán en tiempo de ejecución.
fuente
Este es un buen video de YouTube que habla sobre
var
VSDynamic
con una demostración práctica.A continuación se muestra una explicación más detallada con una instantánea.
Var está enlazado antes (estáticamente verificado) mientras que dinámico está enlazado tarde (evaluado dinámicamente).
La palabra clave Var analiza los datos de su lado derecho y luego, durante el tiempo de compilación, decide el tipo de datos de la izquierda. En otras palabras, la palabra clave var simplemente le ahorra escribir muchas cosas. Eche un vistazo a la imagen a continuación, donde cuando hemos dado datos de cadena y la variable x muestra el tipo de datos de cadena en mi información sobre herramientas.
Por otro lado, la palabra clave dinámica tiene un propósito completamente diferente. Los objetos dinámicos se evalúan durante el tiempo de ejecución. Por ejemplo, en el código siguiente, la propiedad "Longitud" existe o no se evalúa durante el tiempo de ejecución. He escrito una pequeña "l" a propósito, por lo que este programa se compiló bien, pero cuando realmente se ejecutó arrojó un error cuando la propiedad "longitud" fue llamado (PEQUEÑO "l").
fuente
La variable dinámica y la variable var pueden almacenar cualquier tipo de valor, pero es necesario para inicializar 'var' en el momento de la declaración.
El compilador no tiene ninguna información sobre el tipo de variable "dinámica". var es seguro para el compilador, es decir, el compilador tiene toda la información sobre el valor almacenado, por lo que no causa ningún problema en tiempo de ejecución.
El tipo dinámico se puede pasar como argumento de función y la función también puede devolverlo. 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ó.
En el caso de la conversión dinámica no es necesaria, pero debe conocer la propiedad y los métodos relacionados con el tipo almacenado, mientras que para var no es necesario emitir porque el compilador tiene toda la información para realizar la operación.
dinámico: útil cuando se codifica utilizando la reflexión o el soporte de lenguaje dinámico o con los objetos COM, porque necesitamos escribir menos cantidad de código.
var: útil cuando se obtienen resultados de las consultas linq. En el marco 3.5 se presenta para admitir la función linq.
Referencia: Counsellingbyabhi
fuente
fuente
No confundir dinámico y var. Declarar una variable local usando var es solo un atajo sintáctico que hace que el compilador infiera el tipo de datos específico de una expresión. La palabra clave var solo se puede usar para declarar variables locales dentro de un método, mientras que la palabra clave dinámica se puede usar para variables locales, campos y argumentos. No puede convertir una expresión en var, pero puede convertir una expresión en dinámica. Debe inicializar explícitamente una variable declarada usando var, mientras que no tiene que inicializar una variable declarada con dinámica.
fuente
Ejemplo:
Pero en el tipo dinámico, el tipo subyacente se determina solo en el tiempo de ejecución. El tipo de datos dinámico no se verifica en el momento de la compilación y tampoco está fuertemente tipado. Podemos asignar cualquier valor inicial para el tipo dinámico y luego se puede reasignar a cualquier nuevo valor durante su vida útil.
Ejemplo:
Tampoco proporciona soporte IntelliSense. No brinda un mejor soporte cuando damos trabajo con linq también. Porque no admite expresiones lambda, métodos de extensión y métodos anónimos.
fuente
Aquí están las diferencias.
var se escribe estáticamente (tiempo de compilación), dinámico se escribe dinámicamente (tiempo de ejecución)
Una variable declarada como var solo puede usarse localmente, las variables dinámicas pueden pasarse como parámetros para funcionar (la firma de función puede definir un parámetro como dinámico pero no var).
con dinámico, la resolución de las propiedades ocurre en tiempo de ejecución y ese no es el caso con var, lo que significa que en tiempo de compilación cualquier variable declarada como dinámica puede llamar a un método que puede existir o no, por lo que el compilador no arrojará un error.
La conversión de tipos con var no es posible pero con dinámica es posible (puede convertir un objeto como dinámico pero no como var).
Arun Vijayraghavan
fuente