谈谈dynamic关键字

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


运行这段代码将显示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只在编译时存在,在运行时不存在.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值