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作为函数参数一样,会为程序的维

 

护带来后续的麻烦。

 

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

 

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









本文转载:CSDN博客