1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
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 作为函数参数一样,会为程序的维
护带来后续的麻烦。 没有人能够确定使用者传入的是什么,而且编译时候不会有问题 。如果错误出现在运行时,就有可能是灾难。 |
相关文章
- 11-23js中数组删除 splice和delete的区别,以及delete的使用
- 11-23cookie、localStorage和sessionStorage 三者之间的区别以及存储、获取、删除等使用方式
- 11-23使用帮助命令man和help的区别以及建议
- 11-23dynamic和var的区别
- 11-23var,dynamic,object的区别
- 11-23freopen函数的使用以及freopen与fopen的区别
- 11-23@JsonFormat、@JSONField、@DateTimeFormat的使用以及其区别
- 11-23使用帮助命令man和help的区别以及建议
- 11-23var, object, dynamic的区别以及使用
- 11-23SpringMvc拦截器与过滤器的区别,以及拦截器的使用