c# visual-studio-2010 .net-4.0

c# - dinámico vs var



visual-studio-2010 .net-4.0 (3)

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

En el caso dynamic , no es así.

Posible duplicado:
¿Cuál es la diferencia entre dynamic (C # 4) y 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 al método, operador e indexador, propiedades y campos de acceso, e incluso invocaciones de objetos que omiten la vinculación estática normal de C # y en su lugar se resuelven dinámicamente .

Mientras que la definición de var es: una variable local implícitamente tipada se escribe fuertemente como si hubiera declarado el tipo usted mismo, pero el compilador determina el tipo .

¿Cómo es esto diferente en el contexto del código a continuación?

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


var es type safe, en el sentido de que utiliza 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.


var significa que se deduce el tipo estático ; en su caso, es exactamente equivalente a

A a1 = new A();

Toda la encuadernación todavía se realiza completamente estáticamente. Si miras el código generado, será exactamente el mismo que con la declaración anterior.

dynamic significa que todas las expresiones que utilizan 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 verificará si el método Foo existe; 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 el momento de la ejecución, respondiendo a cualquier llamada al método (u otro tipo de uso); en otras palabras, no tiene que haber un método "real" llamado Foo en absoluto.

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