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());
2
枚举所有成员
foreach
(
var
property
in
(IDictionary<String,
Object>)
person)
{
Response.Write(property.Key
+
":
"
+
property.Value);
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
作为函数参数一样,会为程序的维
护带来后续的麻烦。
没有人能够确定使用者传入的是什么,而且编译时候不会有问题
。如果错误出现在运行时,就有可能是灾难。相互学习,有不对的地方多多指出