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作为函数参数一样,会为程序的维
护带来后续的麻烦。
没有人能够确定使用者传入的是什么,而且编译时候不会有问题
。如果错误出现在运行时,就有可能是灾难。
1. var表示“变量的类型是在编译时决定的”, var让你在初始化变量时少输入一些字,编译器会根据右值来推断出变量的类型, var只能用于局部变量的定义,你不能把类的属性定义成 var,也不能把方法的返回值类型或者是参数类型定义成var
2. dynamic表示“变量的类型是在运行时决定的”,动态语言运行时(dynamic language runtime DLR)是.NET Framework 4 Beta 1中的一组新的API,它提供了对c#中dynamic类型的支持, dynamic告诉编译器,根本就别理究竟是啥类型,运行时再推断不迟,dynamic类型并没有跳过类型校验,只是延迟到了运行时。如果在运行时,检测到类型不兼容,照样会抛出异常。变量,属性,方法返回值类型及参数类型都可定义为dynamic。
你可能在以下情况下使用dynamic:
1.COM对象
2.动态语言(如IronPython,IronRuby等)对象
3.反射对象
4.C# 4.0中动态创建的对象
因此,dynamic与var具有截然不同的含义。
1.var声明一个局部变量只是一种简化语法,它要求编译器根据一个表达式推断具体的数据类型。
2.var只能用于声明方法内部的局部变量,而dynamic可用于局部变量,字段,参数。
3.表达式不能转型为var,但能转型为dynamic。
4.必须显式初始化用var声明的变量,但无需初始化用dynam声明的变量。
常有人会拿var这个关键字来和dynamic做比较。实际上,var和dynamic完全是两个概念,根本不应该放在一起做 比较。var实际上是编译期抛给我们的“语法糖”,一旦被编译,编译期会自动匹配var 变量的实际类型,并用实际类型来替换该变量的申明,这看上去就好像我们在编码的时候是用实际类型进行申明的。而dynamic被编译后,实际是一个 object类型,只不过编译器会对dynamic类型进行特殊处理,让它在编译期间不进行任何的类型检查,而是将类型检查放到了运行期。
这从visual studio的编辑器窗口就能看出来。以var声明的变量,支持“智能感知”,因为visual studion能推断出var类型的实际类型,而以dynamic声明的变量却不支持“智能感知”,因为编译器对其运行期的类型一无所知。对 dynamic变量使用“智能感知”,会提示“此操作将在运行时解析”
http://www.cnblogs.com/stone_w/archive/2011/02/17/1957014.html
var, object, dynamic的区别以及使用(转载)的更多相关文章
- var, object, dynamic的区别以及dynamic的使用
var, object, dynamic的区别以及dynamic的使用 理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用 2013-06- ...
- var, object, dynamic的区别以及使用
var, object, dynamic的区别以及使用 阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 拿这三者比较的原因 ...
- 理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用
阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 一. 为什么是它们三个? 拿这三者比较的原因是它们在使用的时候非常相似.你 ...
- var object dynamic的区别
一.var var本身不是一种类型,只是一种语法糖:var声明的变量在赋值的时候即已决定其变量类型,编译时会进行校验. 二.object object是所以类型的基类,故可以赋任何类型的值. 三.dy ...
- [转]理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用
阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 一. 为什么是它们三个? 拿这三者比较的原因是它们在使用的时候非常相似.你 ...
- 【C# 基础概念】C# 4 dynamic - var, object, dynamic的区别以及dynamic的使用
阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 一. 为什么是它们三个? 拿这三者比较的原因是它们在使用的时候非常相似.你 ...
- Var与Dynamic的区别
1.var与dynamic的区别 C#中的很多关键词用法比较容易混淆,var和dynamic就是其中一组,但其实它们是有本质的区别的.var 在编译阶段已经确定类型,在初始化时候,必须提供初始化的 ...
- 简述C#中关键字var和dynamic的区别
C#中关键字var和dynamic的区别如下: 1.var申明的变量必须初始化,dynamic申明的变量无需初始化. 2.var关键字只能在方法内部申明局部变量,dynamic关键字可用于局部变量,字 ...
- var和dynamic的区别及如何正确使用dynamic ?
C#中的很多关键词用法比较容易混淆,var和dynamic就是其中一组,他们都可以申明动态类型的变量,但是本质上他们还是有不少区别的.var 在编译阶段已经确定类型,在初始化时候,必须提供初始化的值, ...
随机推荐
- 宣布正式发布 Biz Talk Services、Azure Active Directory 和 Traffic Manager, 同时发布 Azure Active Directory 高级版预览
除经济优势之外,云计算还在可转化为竞争优势的应用程序开发方面提供了更大的灵活性.我们很高兴看到每天创建的新 Windows Azure 订阅超过 1000 个,更令人兴奋的是,有一半客户使用价值更高的 ...
- 【Cavali风格/优质羊毛混纺面料/高密抗静电里衬/撞色拼皮/立领/绿色/便装单西】玛萨玛索男装网购商城
[Cavali风格/优质羊毛混纺面料/高密抗静电里衬/撞色拼皮/立领/绿色/便装单西]玛萨玛索男装网购商城 Cavali风格/优质羊毛混纺面料/高密抗静电里衬/撞色拼皮/立领/绿色/便装单西
- myeclipse设置凝视
Window-perferences--java--Code Style--Code Templates--Commments 类凝视:Types /** *@desc *@author haozk ...
- C++ Primer 学习笔记_87_用于大型程序的工具 --异常处理
用于大型程序的工具 --异常处理 引言: C++语言包括的一些特征在问题比較复杂,非个人所能管理时最为实用.如:异常处理.命名空间和多重继承. 相对于小的程序猿团队所能开发的系统需求而言,大规模编程[ ...
- ViewPager+Fragment实现支持左右滑动的Tab
主要思想:顶部标题栏top.xml,中间ViewPager(4个Fragment),底部导航 top.xml和bottom.xml在我之前的两个随笔里有,此处不再赘述. activity_main.x ...
- 小猪猪逆袭成博士之C++基础篇(三)字符串
小猪猪逆袭成博士之C++基础篇(三)字符串 String 写在题外的话: 非常感谢在我发了第一篇随笔以后有很多人看还评论了,这大概就是一种笔记性质的,也不一定全对,如果不对的地方请指出来让我加以改正. ...
- Win10玩魔兽争霸不能全屏显示的设置教程
Win10玩魔兽争霸不能全屏显示的设置教程: 1.右击桌面左下角的windows图标,显示图片内容,然后点击运行: 2.点击运行,有个输入框,输入regedit,点击确认: 3.显示win10注册表, ...
- PHP学习笔记4-类/命名空间/成员方法/类方法
命名空间 namespace 类 class创建文件Hello.php,namespace是jikexueyuan: <?php /** * Created by PhpStorm. * U ...
- Docker 安装命令
curl -sSL https://get.daocloud.io/docker | sh
- Java网络蜘蛛/网络爬虫 Spiderman
Spiderman - 又一个Java网络蜘蛛/爬虫 Spiderman 是一个基于微内核+插件式架构的网络蜘蛛,它的目标是通过简单的方法就能将复杂的目标网页信息抓取并解析为自己所需要的业务数据. 主 ...