C#中的动态类型与var有何区别?

51
“Possible Duplicate:”:
什么是动态 (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);

请参见https://dev59.com/_nNA5IYBdhLWcg3wcNXF。 - Crescent Fresh
3个回答

92

var代表类型是被推断的静态(static)类型 - 在你的情况下,它与下面的代码完全等价

var意味着变量的类型是由程序自动推断出来的,这种类型在编译期间就已经确定了。在您的情况下,使用var和指定类型是一样的。

A a1 = new A();

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

dynamic 表示使用 a2 的任何表达式都是在执行时而不是编译时绑定的,因此它可以具有动态行为。编译器不会检查 Foo 方法是否存在 - 行为在执行时被确定。实际上,如果对象实现了 IDynamicMetaObjectProvider,它可以决定在执行时对调用做出响应,响应于任何方法调用(或其他类型的使用)- 换句话说,根本不需要一个名为Foo的“真实”方法。

如果您在动态情况下查看生成的代码,您会发现涉及调用站点和绑定器的各种奇妙而神奇的操作。


24

var是类型安全的,因为它使用类型推断。 写成var a = new A();相当于写成A a = new A();。 声明为dynamic的变量是不安全的,编译器不会检查您在其上调用的方法是否存在。


13
var的情况下,编译时A()必须拥有一个名为.Foo(int)的方法。
dynamic的情况下,它不需要。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接