【问题标题】:dynamic vs var in C# [duplicate]C#中的动态vs var [重复]
【发布时间】:2023-03-28 17:35:01
【问题描述】:
可能重复:
What’s the difference between dynamic(C# 4) and var?
.NET 4.0 (VS 2010) 中的 dynamic 和 var 关键字有什么区别。根据 MSDN,动态的定义是 - 动态查找允许您编写方法、运算符和索引器调用、属性和字段访问,甚至是绕过 C# 的正常静态绑定而是动态解析的对象调用 em>。
而 var 的定义是 - 一个隐式类型的局部变量是强类型的,就像你自己声明了类型一样,但是编译器决定了类型。
这在下面的代码上下文中有何不同:
var a1 = new A();
a1.Foo(1);
dynamic a2 = new A();
a2.Foo(1);
【问题讨论】:
标签:
c#
visual-studio-2010
.net-4.0
【解决方案1】:
var 表示推断出 static 类型 - 在您的情况下,它完全等同于
A a1 = new A();
所有绑定仍然完全静态完成。看看生成的代码,和上面的声明一模一样。
dynamic 表示所有使用a2 的表达式在执行时而不是在编译时绑定,因此它可以动态运行。编译器不会检查 Foo 方法是否存在 - 行为是在执行时确定的。事实上,如果对象实现了IDynamicMetaObjectProvider,它可以决定在执行时如何处理调用,响应 any 方法调用(或其他类型的使用) - 换句话说,没有必须是一个名为Foo 的“真实”方法。
如果您在动态情况下查看生成的代码,您会发现与调用站点和活页夹有关的各种奇怪而奇妙的东西。
【解决方案2】:
var 是类型安全的,因为它使用类型推断。
写作var a = new A(); 是A a = new A(); 的简写。
声明为 dynamic 的变量不是类型安全的,编译器不会检查您调用的方法是否存在。
【解决方案3】:
在var 的情况下,A() 在编译期间必须有一个.Foo(int) 方法。
在dynamic 的情况下,它不会。