谈谈dynamickeyword
前言
今天和谈了两年的女朋友分手了,一開始我还认为是由于这次的吵架,由于我今天一天没联系她,她就生气了,说了分手,我是说一開始我以为是这样.然后我想了想,矛盾就像不停的在往一个瓶子里到硫酸,有可能由于这一滴的缘故导致瓶子里的硫酸溢出来了,有了矛盾就要攻克了,珍惜眼前人.
正文
废话说了一大堆,说点正经的,C#4.0提供了一个keyworddynamic,我在曾经的时候说过这个keyword.今天来看看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仅仅在编译时存在,在执行时不存在.