zoukankan      html  css  js  c++  java
  • var, object, dynamic的区别以及使用(转载)

    var, object, dynamic的区别以及使用
    
    阅读目录:
    
    一. 为什么是它们三个
    
    二. 能够任意赋值的原因
    
    三. dynamic的用法
    
    四. 使用dynamic的注意事项
    
    拿这三者比较的原因是它们在使用的时候非常相似。你可以用它
    
    们声明的变量赋任何类型的值。
    
    看看下面的示例:
    
    var a = 1;
    
    object b = 1;
    
    dynamic c = 1;
    
    上面的例子中,看起来三者非常相似,但是背后的原理却是非常
    
    不同。
    
    var是C# 3中引入的,其实它仅仅只是一个语法. var本身并不是
    
    一种类型, 其它两者object和dynamic是类型。
    
    var声明的变量在赋值的那一刻,就已经决定了它是什么类型。
    
    所以如果你这样使用,就会有编译错误:
    
    var a = 1;
    
    a = "Test";
    
    object之所以能够被赋值为任意类型的原因,其实都知道,因为
    
    所有的类型都派生自object. 所以它可以赋值为任何类型:
    
    object a = 1;
    
    a = "Test";
    
    dynamic不是在编译时候确定实际类型的, 而是在运行时。
    
    所以下面的代码是能够通过编译的,但是会在运行时报错:
    
    dynamic a = "test";
    
    a++;
    
    三. dynamic的用法
    
    1 直接使用该类型,可以非常方便的插入属性, 方法
    
    dynamic person = new System.Dynamic.ExpandoObject();
    
    person.id = 1;
    
    person.title = "贵源网络";
    
    person.url = "gzmsg.com";
    
    person.co = "软件开发";
    
    person.des = new Func<string>(() => person.title + 
    
    person.url);
    
    Response.Write(person.des());//结果:贵源网络gzmsg.com
    
    2 枚举所有成员
    
    foreach (var property in (IDictionary<String, Object>)
    
    person)
    
    {
    
    Response.Write(property.Key + ": " + property.Value);
    
    //结果:id: 1title: 贵源网络url: gzmsg.comco: 软件开发
    
    des: System.Func`1[System.String]
    
    }
    
    3 简化反射
    
    常用的处理反射的例子:
    
    object calc = GetCalculator();
    
    Type calcType = calc.GetType();
    
    object res = calcType.InvokeMember( "Add", 
    
    BindingFlags.InvokeMethod, null, new object[] { 10, 20 
    
    });
    
    int sum = Convert.ToInt32(res);
    
    使用dynamic之后:
    
    dynamic calc = GetCalculator();
    
    int sum = calc.Add(10, 20);
    
    四,使用dynamic的注意事项
    
    有了dynamic,.net就以及有了动态类型的优势,但是由于对于
    
    dynamic类型的所有操作,都是在运行时确定的,所有错误无法在
    
    编译时候出现,使用的时候,就需要非常小心。
    
    因为dynamic是类型,所以如果函数接受的是确定类型的参数,是
    
    不能传入dynamic类型的,这样会有编译错误。比如:
    
    复制代码
    
    public int Add(int a, int b){
    
    return a + b;
    
    }
    
    dynamic test1 = 1;
    
    dynamic test2 = 2;
    
    Add(test1, test2);

    另外,在我们自己在写函数时,最好不要将dynamic类型作为函数

    的参数,这就像是使用object作为函数参数一样,会为程序的维

    护带来后续的麻烦。

    没有人能够确定使用者传入的是什么,而且编译时候不会有问题

    。如果错误出现在运行时,就有可能是灾难。


    1. var表示“变量的类型是在编译时决定的”, var让你在初始化变量时少输入一些字,编译器会根据右值来推断出变量的类型, var只能用于局部变量的定义,你不能把类的属性定义成 var,也不能把方法的返回值类型或者是参数类型定义成var

    2. dynamic表示“变量的类型是在运行时决定的”,动态语言运行时(dynamic language runtime DLR)是.NET Framework 4 Beta 1中的一组新的API,它提供了对c#中dynamic类型的支持, dynamic告诉编译器,根本就别理究竟是啥类型,运行时再推断不迟,dynamic类型并没有跳过类型校验,只是延迟到了运行时。如果在运行时,检测到类型不兼容,照样会抛出异常。变量,属性,方法返回值类型及参数类型都可定义为dynamic。

    你可能在以下情况下使用dynamic:

    1.COM对象

    2.动态语言(如IronPython,IronRuby等)对象

    3.反射对象

    4.C# 4.0中动态创建的对象

    因此,dynamic与var具有截然不同的含义。


    1.var声明一个局部变量只是一种简化语法,它要求编译器根据一个表达式推断具体的数据类型。

    2.var只能用于声明方法内部的局部变量,而dynamic可用于局部变量,字段,参数。

    3.表达式不能转型为var,但能转型为dynamic。

    4.必须显式初始化用var声明的变量,但无需初始化用dynam声明的变量。

           常有人会拿var这个关键字来和dynamic做比较。实际上,var和dynamic完全是两个概念,根本不应该放在一起做 比较。var实际上是编译期抛给我们的“语法糖”,一旦被编译,编译期会自动匹配var 变量的实际类型,并用实际类型来替换该变量的申明,这看上去就好像我们在编码的时候是用实际类型进行申明的。而dynamic被编译后,实际是一个 object类型,只不过编译器会对dynamic类型进行特殊处理,让它在编译期间不进行任何的类型检查,而是将类型检查放到了运行期。

    这从visual studio的编辑器窗口就能看出来。以var声明的变量,支持“智能感知”,因为visual studion能推断出var类型的实际类型,而以dynamic声明的变量却不支持“智能感知”,因为编译器对其运行期的类型一无所知。对 dynamic变量使用“智能感知”,会提示“此操作将在运行时解析”


    http://www.cnblogs.com/stone_w/archive/2011/02/17/1957014.html

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    博文来源广泛,如原作者认为我侵犯知识产权,请尽快给我发邮件 664507902@qq.com联系,我将以第一时间删除相关内容。

查看全文
  • 相关阅读:
    mac lsof使用查看端口
    mac 安装gevent报错
    vim命令学习
    linux批量关闭进程
    坐标点转换
    screen命令记录
    hashlib模块
    PyYAML和configparser模块讲解
    xml处理模块
    json、pickleshelve模块(超级好用~!)讲解
  • 原文地址:https://www.cnblogs.com/ooip/p/4715266.html
  • Copyright © 2011-2022 走看看