这两个变量定义有什么不同?
object oVar;
dynamic dVar;
性能?内存分配?优点
答案 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也发了几篇关于细节的帖子: