2009-12-17 18 views
50

Duplicar posible:
What’s the difference between dynamic(C# 4) and var?dinámico vs var

¿Cuál es la diferencia entre la palabra clave dinámica y var en .NET 4.0 (VS 2010). Según MSDN, la definición de dinámica es - La búsqueda dinámica le permite escribir llamadas de método, operador e indexador, propiedades y campos de acceso e incluso invocaciones de objetos que omiten el enlace estático normal de C# y se resuelven dinámicamente.

Considerando que la definición de var es - Una variable local tipeada implícitamente se tipea fuertemente como si hubiera declarado el tipo usted mismo, pero el compilador determina el tipo.

¿Cómo es esto diferente en el contexto de código siguiente:

var a1 = new A(); 
a1.Foo(1); 

dynamic a2 = new A(); 
a2.Foo(1); 
+0

Ver http://stackoverflow.com/questions/961581/whats-the-difference-between-dynamicc-4-and-var –

Respuesta

90

var significa el tipo estático se infiere - en su caso es exactamente equivalente a

A a1 = new A(); 

Toda la unión se sigue haciendo totalmente estática. Si miras el código generado, será exactamente el mismo que con la declaración anterior.

dynamic significa que todas las expresiones que usan a2 están vinculadas en el tiempo de ejecución en lugar de en tiempo de compilación, por lo que pueden comportarse dinámicamente. El compilador no comprobará si existe el método Foo; el comportamiento se determina en el momento de la ejecución. De hecho, si el objeto implementa IDynamicMetaObjectProvider podría decidir qué hacer con la llamada en tiempo de ejecución, respondiendo a cualquier llamada de método (u otro tipo de uso) - en otras palabras, no tiene que ser un "real" método llamado Foo en absoluto.

Si mira el código generado en la situación dinámica, encontrará todo tipo de cosas extrañas y maravillosas que van a hacer con los sitios de llamadas y carpetas.

14

En el caso var, A() tiene que tener un método .Foo(int) en él durante la compilación.

En el caso dynamic, no es así.

24

var es un tipo seguro, ya que utiliza la inferencia tipo. Escribir var a = new A(); es una abreviatura de A a = new A();. Una variable que se declara dynamic NO es segura y el compilador no hace nada para verificar que existan los métodos que usted llama.

Cuestiones relacionadas