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

ram*_*leh 24 c# c#-4.0

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

object oVar;
dynamic dVar;
Run Code Online (Sandbox Code Playgroud)

性能?内存分配?好处?

And*_*are 33

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

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

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


Ode*_*ded 17

object 适用于所有.NET版本.

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

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

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

dynamic 是.NET 4.0的新功能.

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


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

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

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

当然,如果您想拥有动态对象,则无法使用object并且必须使用dynamic.