zoukankan      html  css  js  c++  java
  • 浅谈Dynamic 关键字系列之一:dynamic 就是Object(转)

    C# 4.0提供了一个dynamic 关键字,那么什么是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;

    编译:

    image

    可以看到对于表达式 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代码增加如下代码:

    //下面这句话会无法通过编译,typeof 运算符无法用在动态类型上
    //Console.WriteLine(typeof(dynamic)); 
    Console.WriteLine(typeof(List<dynamic>));
    如果你是typeof(dynamic)会报typeof运算符无法用在动态类型上的错误,
    但是如果你写的是List<dynamic> 那么输出结果如下:
    image 

    可以看到输出时System.Object

    微软对此的解释是:

    在大多数情况下, dynamic 类型与 object 类型的行为是一样的。 但是,不会用编译器对包含 dynamic 类型表达式的操作进行解析或类型检查。 编译器将有关该操作信息打包在一起,并且该信息以后用于计算运行时操作。在此过程中,类型 dynamic 的变量会编译到类型 object 的变量中。 因此,类型 dynamic 只在编译时存在,在运行时则不存在。

  • 相关阅读:
    day05 Python
    重新理解apache解析漏洞
    PhpAdmin安装报错, php syntax error, unexpected T_STRING on line 8
    一键配置Visual Studio Code( 1.57.1)开发java
    apt-get upgarde 和dist-upgrade的差别
    解决 Python2 报错 LookupError: unknown encoding: cp65001
    文件上传漏洞随手感想
    161端口SNMP敏感信息泄露漏洞
    使用电模拟器导出微信小程序包(wxapkg)
    kali安装docker
  • 原文地址:https://www.cnblogs.com/shenyixin/p/3644629.html
Copyright © 2011-2022 走看看