C#中的动态vs var

Bha*_*kar 52 c# .net-4.0 visual-studio-2010

可能重复:
动态(C#4)和var之间有什么区别?

.NET 4.0(VS 2010)中dynamic和var关键字的区别是什么.根据MSDN,动态定义是 - 动态查找允许您编写方法,操作符和索引器调用,属性和字段访问,甚至是绕过C#的常规静态绑定的对象调用,而是动态解析.

var的定义是 - 隐式类型的局部变量是强类型的,就像你自己声明了类型一样,但编译器确定了类型.

这在下面的代码上下文中有何不同:

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

dynamic a2 = new A();
a2.Foo(1);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 93

var意味着推断静态类型 - 在您的情况下,它完全等同于

A a1 = new A();
Run Code Online (Sandbox Code Playgroud)

所有绑定仍然完全静态完成.如果查看生成的代码,它将与上述声明完全相同.

dynamic表示所有使用的表达式a2都是在执行时而不是在编译时绑定的,因此它可以动态运行.编译器不会检查Foo方法是否存在 - 行为是在执行时确定的.事实上,如果对象实现IDynamicMetaObjectProvider它可以决定如何处理在执行时通话,应对任何方法调用(或其他类型的使用) -换句话说,有没有被称为一个"真实"的方法,Foo在所有.

如果你在动态情况下查看生成的代码,你会发现与调用站点和绑定器有关的各种奇怪和奇妙的东西.


Kla*_*sen 25

var是类型安全的,因为它使用类型推断.写作var a = new A();是一种简写A a = new A();.声明的变量是非dynamic类型安全的,编译器不会检查您调用的方法是否存在.


Ode*_*ded 14

在这种var情况下,A()必须.Foo(int)在编译期间有一个方法.

在这种dynamic情况下,它没有.