• 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的用法
    直接使用该类型,可以非常方便的插入属性, 方法

    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
    枚举所有成员

    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]

    }
    简化反射

    常用的处理反射的例子:

    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);

  • 相关阅读:
    【51nod 1331】狭窄的通道
    【noip 2016】提高组
    【noip 2016】普及组
    【bzoj 4764】弹飞大爷
    线筛
    高斯消元
    网络流
    平衡二叉树 treap

    双向广搜
  • 原文地址:https://www.cnblogs.com/tianxuan/p/4738686.html
Copyright © 2020-2023  润新知