【问题标题】:dynamic keyword vs object data type [duplicate]动态关键字与对象数据类型[重复]
【发布时间】:2011-07-28 05:44:26
【问题描述】:

这两个变量定义有什么不同?

object oVar;
dynamic dVar;

性能?内存分配?好处?

【问题讨论】:

    标签: c# c#-4.0


    【解决方案1】:

    编译器将一个变量键入为object,编译器将验证所有实例成员是否有效。另一个变量的类型为dynamic,编译器将忽略所有实例成员,并在执行时由 DLR 调用。

    它与性能或内存分配无关。 dynamic 类型是编译器有些忽略的静态类型。它使您能够在静态类型语言中使用duck typing,这提供了很大的灵活性(尤其是在处理以更动态的语言编写的组件时)。

    我绝对建议您阅读以下主题:

    【讨论】:

      【解决方案2】:

      object 适用于所有 .NET 版本。

      它是所有其他类型继承的基类型,因此任何类型都可以转换为object

      您不能在声明为 object 的变量上动态添加和更改任何内容。

      声明是静态类型的并由编译器检查。

      dynamic 是 .NET 4.0 的新功能。

      它允许您动态添加和更改属性和方法,而无需编译器检查它们(因此,如果您编写的内容有误,您只会在运行时发现)。


      在内存分配方面 - 差别不大。两者都是引用类型,分配给其中任何一个的任何对象都已经分配了内存来存储它。

      在性能方面,由于 DLR 涉及到dynamic,因此会有一些开销。您将需要测试并查看。

      至于其他好处 - dynamic 在处理动态对象/数据(例如 XML 文件)时确实有助于提高可读性。它也有助于以类似的方式进行反思。

      当然,如果你想拥有动态对象,你不能使用object,而拥有要使用dynamic

      【讨论】:

        【解决方案3】:

        由于使用了所有额外的逻辑,dynamic 关键字还会给您的执行时间增加一些开销 - 因此,如果您不需要动态运行时或互操作并且可以不使用对象,那么您的代码将更加高效。

        有关动态关键字的更多信息可以在 Jeff Richter 的书中找到:CLR via C#, 3rd Edition

        Sam Gentile 也发了几篇关于细节的帖子:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-24
          • 2011-03-27
          • 2018-12-05
          • 1970-01-01
          • 2011-09-23
          • 1970-01-01
          • 1970-01-01
          • 2019-10-20
          相关资源
          最近更新 更多