.NET 4.0(VS 2010)中dynamic和var关键字的区别是什么。根据MSDN,动态的定义是 - 动态查找允许您编写方法,操作符和索引器调用,属性和字段访问,甚至是绕过C#的正常静态绑定的对象调用,而是动态解析
var的定义是 - 隐式类型的局部变量是强类型的,就像你自己声明了类型一样,但编译器确定了类型。
下面的代码上下文有何不同之处:
var a1 = new A();
a1.Foo(1);
dynamic a2 = new A();
a2.Foo(1);
答案 0 :(得分:93)
var
表示推断 static 类型 - 在您的情况下,它完全等同于
A a1 = new A();
所有绑定仍然是完全静态完成。如果查看生成的代码,它将与上述声明完全相同。
dynamic
表示使用a2
的所有表达式都是在执行时而不是在编译时绑定的,因此它可以动态运行。编译器不会检查Foo
方法是否存在 - 行为是在执行时确定的。实际上,如果对象实现IDynamicMetaObjectProvider
,它可以决定在执行时如何处理调用,响应任何方法调用(或其他类型的使用) - 换句话说,没有必须是一个名为Foo
的“真实”方法。
如果你在动态情况下查看生成的代码,你会发现各种奇怪和精彩的东西与呼叫站点和绑定器有关。
答案 1 :(得分:25)
var
是类型安全的,因为它使用类型推断。
写var a = new A();
是A a = new A();
的简写。
声明为dynamic
的变量不是类型安全的,编译器不会检查您调用它的方法是否存在。
答案 2 :(得分:14)
在var
的情况下,A()在编译期间必须有一个.Foo(int)
方法。
在dynamic
案例中,它没有。