标签:c#
谈谈dynamic关键字
今天和谈了两年的女朋友分手了,一开始我还觉得是因为这次的吵架,因为我今天一天没联系她,她就生气了,说了分手,我是说一开始我以为是这样.然后我想了想,矛盾就像不停的在往一个瓶子里到硫酸,有可能因为这一滴的缘故导致瓶子里的硫酸溢出来了,有了矛盾就要解决了,珍惜眼前人.
正文
废话说了一大堆,说点正经的,C#4.0提供了一个关键字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.Int32 System.Int32
在WriteLine方法后面增加两行:
dyn = dyn + 3; obj = obj + 3;
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 = 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代码增加如下代码:
//下面这句话会无法通过编译,<span style="font-size:14px;color:#ff0000;"><strong>typeof运算符无法用在动态类型上</strong></span> //Console.WriteLine(typeof(dynamic)); //下面这句话是对的 Console.WriteLine(typeof(List<dynamic>));
分析原因:如果你是typeof(dynamic)会报出typeof运算符无法拥在动态类型上的错误,但是如果你写的是List<dynamic>那么输出结果就是这样的:
System.Collections.Generic.List`1[System.Object]
可以看到输出是:System.Object
微软对此有个解释:
大多数情况下,dynamic类型与object类型的行为是一致的.但是,不会用编译器对包含dynamic类型表达式的操作进行解析或类型检查.编译器将有关该操作信息打包在一起,并且该信息以后用于计算运行时操作.在此过程中,类型dynamic的变量会编译到类型object的变量中.因此,类型dynamic只在编译时存在,在运行时不存在.
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:c#
原文地址:http://blog.csdn.net/shanyongxu/article/details/47760109