动态关键字vs对象数据类型

时间:2011-04-02 12:03:33

标签: c# c#-4.0

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

object oVar;
dynamic dVar;

性能?内存分配?优点

3 个答案:

答案 0 :(得分:31)

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

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

我肯定会建议您阅读以下主题:

答案 1 :(得分:17)

object对所有.NET版本都有效。

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

您无法动态添加和更改声明为object的变量的任何内容。

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

dynamic是.NET 4.0的新功能。

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


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

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

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

当然,如果您想拥有动态对象,则无法使用object 来使用dynamic

答案 2 :(得分:0)

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

有关动态关键字的更多信息,请参阅Jeff Richter的书:CLR via C#, 3rd Edition

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