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作为函数参数一样,会为程序的维
     
    护带来后续的麻烦。
     
    没有人能够确定使用者传入的是什么,而且编译时候不会有问题
     
    

    出处:https://blog.csdn.net/wlp5188199/article/details/80229247

  • 相关阅读:
    pygame 笔记-7 生命值/血条处理
    pygame 笔记-6 碰撞检测
    pygame 笔记-5 模块化&加入敌人
    pygame 笔记-4 代码封装&发射子弹
    tk.mybatis通用插件updateByPrimaryKeySelective无法自动更新ON UPDATE CURRENT_TIMESTAMP列的解决办法
    pygame 笔记-3 角色动画及背景的使用
    pygame 笔记-2 模仿超级玛丽的弹跳
    pygame 笔记-1 按键控制方块移动
    mysql技巧:如果记录存在则更新/如果不存在则插入的三种处理方法
    mac上mysql8.0以tar.gz方式手动安装
  • 原文地址:https://www.cnblogs.com/jsll/p/11751203.html
Copyright © 2011-2022 走看看