C#中的动态vs var

时间:2009-12-17 10:30:43

标签: c# visual-studio-2010 .net-4.0

  

可能重复:
  What’s the difference between dynamic(C# 4) and 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);

3 个答案:

答案 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案例中,它没有。