dynamic与var
可能重复:
dynamic(C#4)和var有什么区别?
.NET 4.0(VS 2010)中的dynamic和var关键字有什么区别? 根据MSDN,dynamic定义是 – dynamic查找允许您编写方法,运算符和索引器调用,属性和字段访问,甚至是绕过C#的正常静态绑定的对象调用,而是dynamicparsing 。
而var的定义是 – 隐式types的局部variables是强types的,就像你自己声明了types一样,但是编译器决定了types 。
这在代码上下文中有什么不同?
var a1 = new A(); a1.Foo(1); dynamic a2 = new A(); a2.Foo(1);
var
意味着静态types被推断 – 在你的情况下,它完全等价于
A a1 = new A();
所有的绑定仍然是完全静态的。 如果您查看生成的代码,它将与上面的声明完全相同。
dynamic
意思是,所有使用a2
expression式都是在执行时绑定的,而不是在编译时绑定的,所以它可以dynamic地运行。 编译器不会检查Foo
方法是否存在 – 行为是在执行时确定的。 事实上,如果对象实现了IDynamicMetaObjectProvider
它可以决定在执行时如何处理调用,响应任何方法调用(或其他types的用法) – 换句话说,不必是称为“真实”的方法Foo
。
如果你看看在dynamic情况下生成的代码,你会发现各种奇怪的和精彩的东西正在做的呼叫站点和活页夹。
var
是types安全的,因为它使用types推断。 写var a = new A();
是A a = new A();
的简写formsA a = new A();
。 声明为dynamic
variables不是types安全的,编译器不会检查您调用的方法是否存在。
在var
情况下,A()在编译期间必须有一个.Foo(int)
方法。
在dynamic
情况下,它不会。