【问题标题】: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 的情况下,它不会。

      【讨论】:

        猜你喜欢
        • 2011-03-14
        • 2014-11-16
        • 2018-06-08
        • 2016-05-25
        • 1970-01-01
        • 1970-01-01
        • 2013-07-28
        • 2016-04-05
        • 2011-05-01
        相关资源
        最近更新 更多