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

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

object oVar; dynamic dVar; 

性能? 内存分配? 好处?

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

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

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

  • 动态(C#参考)
  • 使用Type动态(C#编程指南)
  • 动态语言运行时概述

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

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

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

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

dynamic是.NET 4.0的新function。

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


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

在性能方面,由于DLR涉及dynamic ,因此会有一些开销。 你需要测试一下。

至于其他好处 – dynamic确实有助于处理动态对象/数据时的可读性,例如XML文件。 它也以类似的方式帮助reflection。

当然,如果你想拥有动态对象,你就不能使用object必须使用dynamic object

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

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

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

  • C#4.0 / BCL 4系列:动态原始类型第1部分
  • C#4.0 / BCL 4系列:动态原始类型第2部分