dynamic和object浅谈

时间:2021-11-22 20:41:19

要想知道dynamic和object的关系必须先理解它们的含义

C# 4.0提供了一个dynamic 关键字。在MSDN里是这样描述:在通过 dynamic 类型实现的操作中,该类型的作用是绕过编译时类型检查, 改为在运行时解析这些操作。 dynamic 类型简化了对 COM API(例如 Office Automation API)、动态 API(例如 IronPython 库)和 HTML 文档对象模型 (DOM) 的访问。在大多数情况下,dynamic 类型与 object 类型的行为是一样的。 但是,不会用编译器对包含 dynamic 类型表达式的操作进行解析或类型检查。 编译器将有关该操作信息打包在一起,并且该信息以后用于计算运行时操作。 在此过程中,类型 dynamic 的变量会编译到类型 object 的变量中。 因此,类型 dynamic 只在编译时存在,在运行时则不存在。

object在MSDN里是这样描述:object 类型在 .NET Framework 中是 Object 的别名。 在 C# 的统一类型系统中,所有类型(预定义类型、用户定义类型、引用类型和值类型)都是直接或间接从 Object 继承的。 可以将任何类型的值赋给 object 类型的变量。 将值类型的变量转换为对象的过程称为“装箱”。 将对象类型的变量转换为值类型的过程称为“取消装箱”。

简单的说类型 dynamic 只在编译时存在,在运行时则不存在。如 dynamic j=8  在编译的时候不做任何类型检查。把这个8编译到object的变量中。运行的时候dynamic就不存在而是System.Int32类型。我在看相关文档很多人认为关于dynamic变量是一个object变量这一点。dynamic 和object还是有区别的

如 dynamic i=9; int j=i+8;在运行的结果是17而object i=9;int j=i+8在运行时就会报错。原因object没有做类型转换。上文已经说过object只是所有类型的父类。而dynamic不需要类型转换的原因是dynamic跳过编译类型检查。什么时候使用dynamic或object根据情况个人决定。个人觉得由于dynamic不需要类型转换不会造成有些类型转换的精度丢失。所以应dynamic比较安全。