浅谈Dynamic 关键字系列之一:dynamic 就是Object
来源:互联网 发布:信息和数据的关系是 编辑:程序博客网 时间:2024/05/18 02:56
C# 4.0提供了一个dynamic 关键字,那么什么是dynamic,究竟dynamic是如何工作的呢?
从最简单的示例开始:
static void Main(string[] args) { dynamic dyn = 1; object obj = 1; //在编译时将鼠标放到 ”dyn” 和”obj”中可以发现: // dyn:局部变量 dynamic (dyn) // obj: 局部变量object (obj) System.Console.WriteLine(dyn.GetType()); System.Console.WriteLine(obj.GetType()); }
运行这段代码将显示 dyn 和obj 的运行时类型:
System.Int32System.Int32
在WriteLine方法后面增加两行:
dyn = dyn + 3;
obj = obj + 3;
编译:
可以看到对于表达式 obj +3 ,编译器器报告了错误,但是不会报 dyn+3 编译。
编译器不会检查包含dyn的表达式,原因在于 dyn 是 dynamic。
类型转换
修改Main代码如下:
dynamic dyn = (dynamic)1;
int j = (int)dyn;
可以看到1被强制转换成dynamic,然后又被强制转换回int.
然而dynamic可以隐式的转换成任何类型,并且也可以从其他类型中转换回来,
所以上面的代码和下面的等价:
dynamic dyn = 1;
int j = dyn;
修改Main代码增加如下代码:
//下面这句话会无法通过编译,typeof 运算符无法用在动态类型上//Console.WriteLine(typeof(dynamic));
Console.WriteLine(typeof(List<dynamic>));
如果你是typeof(dynamic)会报typeof运算符无法用在动态类型上的错误,
但是如果你写的是List<dynamic> 那么输出结果如下:
可以看到输出时System.Object。
微软对此的解释是:
在大多数情况下, dynamic 类型与 object 类型的行为是一样的。 但是,不会用编译器对包含 dynamic 类型表达式的操作进行解析或类型检查。 编译器将有关该操作信息打包在一起,并且该信息以后用于计算运行时操作。在此过程中,类型 dynamic 的变量会编译到类型 object 的变量中。 因此,类型 dynamic 只在编译时存在,在运行时则不存在。
- 浅谈Dynamic 关键字系列之一:dynamic 就是Object
- 浅谈Dynamic 关键字系列之一:dynamic 就是Object
- 浅谈Dynamic 关键字系列之二:调用属性,方法,字段
- 浅谈Dynamic 关键字系列之二:调用属性,方法,字段
- 浅谈Dynamic 关键字系列之三:ExpandoObject, DynamicObject, DynamicMetaObject
- 浅谈Dynamic 关键字系列之四:dynamic为什么比反射快
- @dynamic关键字
- @dynamic关键字
- @dynamic关键字
- dynamic关键字
- dynamic关键字
- dynamic 关键字
- DPCM (Dynamic PCM)系列之一:概述
- 浅谈Dynamic 关键字系列之三(上):ExpandoObject, DynamicObject, DynamicMetaObject
- chap13 Dynamic Object Creation
- dynamic
- @dynamic
- Dynamic
- Redis Primer(1)基于JedisPool的Redis hset并发性能测试
- C++ vector容器类型详解
- 通过命令行来执行php文件
- 项目文件不在apache根目录下怎么可以访问到呢?
- loadrunner简单使用——HTTP,WebService,Socket压力测试脚本编写
- 浅谈Dynamic 关键字系列之一:dynamic 就是Object
- 新旧版hadoop的一些差别
- 编译型语言 和 解释型语言 的区别
- Apparent-time hypothesis
- 循序渐进学unix——上机记录(六),exec
- 浅谈Dynamic 关键字系列之二:调用属性,方法,字段
- SQL Server 跨库查询乱码问题
- 效率问题,Linq查询/多线程/反射/装箱相关
- 浅谈Dynamic 关键字系列之三:ExpandoObject, DynamicObject, DynamicMetaObject