谈谈dynamickeyword

谈谈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());       
 }


执行这段代码将显示dynobj的执行时类型:

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的表达式,原因在于dyndynamic

 

 

 

类型转换

改动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仅仅在编译时存在,在执行时不存在.

posted @ 2017-06-04 11:27  lytwajue  阅读(117)  评论(0编辑  收藏  举报