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 作为函数参数一样,会为程序的维
 
护带来后续的麻烦。
 
没有人能够确定使用者传入的是什么,而且编译时候不会有问题
 
。如果错误出现在运行时,就有可能是灾难。相互学习,有不对的地方多多指出

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值