zoukankan      html  css  js  c++  java
  • 谈谈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仅仅在编译时存在,在执行时不存在.

  • 相关阅读:
    UVA 11859
    [OpenGL]OpenGL坐标系和坐标变换
    树状数组
    编程算法
    乞讨 间隔[a,b]在见面p^k*q*^m(k&gt;m)中数号码
    解析Android的 消息传递机制Handler
    Atitit.故障排除系列---php 计划网站数据库错误排除过程
    Remove Element
    [Angular Directive] Write a Structural Directive in Angular 2
    [Compose] 18. Maintaining structure whilst asyncing
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6939909.html
Copyright © 2011-2022 走看看