zoukankan      html  css  js  c++  java
  • (转)C#4.0的dynamic和var及object关键字辨析

    http://www.cnblogs.com/Mainz/archive/2011/03/10/1980060.html

       1:  dynamic a = 10;
       2:  a = a + 10;
       3:  Console.WriteLine(a.GetType());

    此段代码会输出 System.Int32,第二行不需要类型转换,因为在运行时识别类型。dynamic 在后台使用 System.Object 类型。但与 object 不同的是,动态类型不需要在编译时执行显式转换操作,因为它仅在运行时识别类型。关于dynamic和object的详细区别,看看《What is the difference between “dynamic” and “object” keywords?》

    在 C# 类型系统中,dynamic 实际上是一个静态类型,这个关键字使得C# 获得了动态功能,同时仍然作为静态类型化语言而存在。这句话如何理解,就要理解它是如何实现动态绑定的,看看《Dynamic Binding in C#4.0》

    下面的代码会通过编译,但运行时报错。因为当您使用 dynamic 关键字时,您就告诉编译器关闭编译时检查。

       1:  dynamic a = "test";
       2:  a++;

    来看看var关键字,从C#3.0开始加入的这个,我们对JavaScript的var比较熟悉,看看C#的var:

       1:  var a = 10;
       2:  a = a + 1;
       3:  Console.WriteLine(a.GetType());

    此段代码会输入 System.Int32, 第二行不需要类型转换,var是强类型的。当使用 var 关键字声明变量时,将在编译时根据初始化字符串推断该变量的类型。 在运行时无法更改该变量的类型。

    但要注意的是,var 关键字不过是一个指令,它让编译器根据变量的初始化表达式推断类型;var 不是类型。

    最后看看object,关键字 object 表示 System.Object 类型,它是 C# 类层次结构中的根类型。 此关键字经常在编译时无法确定对象类型时使用,而这种情况经常在各种互操作性情形中发生。

    但用object要避免类型转换(显式或隐式)

       1:   object a = 10;
       2:   a = (int)a + 10;
       3:   a = "test";

    Dynamic可以用来干嘛?

    发挥你的想象力,我可以想到的是可以用来做脚本支持,比如office支持用vba脚本写插件,那我们也可以用这个实现可编写脚本的应用。

    第二个用处就是用动态方法包,动态方法包就是可在运行时添加和删除属性及方法的对象。System.Dynamic命名空间实际上是 DLR 的一部分,可以用 System.Dynamic.ExpandoObject 和 System.Expando.DynamicObject 类与新的 dynamic 关键字相结合实现自己需要的东东。

    第三个用处是替代反射。有个例子,通过反射调用一个计算器对象的Add方法,先前不知道计算器的类型,只知道有个Add方法,代码是这样的:

       1:  object calc = GetCalculator();
       2:  Type calcType = calc.GetType();
       3:  object res = calcType.InvokeMember( "Add", BindingFlags.InvokeMethod, null, new object[] { 10, 20 });
       4:  int sum = Convert.ToInt32(res);

    现在不用反射用dynamic就代码简洁了:

       1:  dynamic calc = GetCalculator();
       2:  int sum = calc.Add(10, 20);

    这样看来Dynamic还是挺有意思的。

  • 相关阅读:
    SQL Server 2005 中的同义词
    SQL SERVER 2005中同义词实例
    聚集索引和非聚集索引(整理)
    linux kernel中timer的使用
    linux命令: patch
    win7(64位)php5.5-Apache2.4-mysql5.6环境安装
    tasklet和工作队列
    linux串口编程(c)
    Notepad++中Windows,Unix,Mac三种格式
    centos7/redhat7 将网卡名字改成eth样式的方法
  • 原文地址:https://www.cnblogs.com/liangouyang/p/4654157.html
Copyright © 2011-2022 走看看