理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用
阅读目录:
一. 为什么是它们三个
二. 能够任意赋值的原因
三. dynamic的用法
四. 使用dynamic的注意事项
一. 为什么是它们三个?
拿这三者比较的原因是它们在使用的时候非常相似。你可以用它们声明的变量赋任何类型的值。
看看下面的示例:
var a = ;
object b = ;
dynamic c = ;
你还可以使用关键字为它们赋上更加复杂的类型
var a = new string[]{""};
object b = new string[]{""};
dynamic c = new string[]{""};
二. 能够任意赋值的原因
上面的例子中,看起来三者非常相似,但是背后的原理却是非常不同。
var是C# 3中引入的,其实它仅仅只是一个语法糖. var本身并不是一种类型, 其它两者object和dynamic是类型。
var声明的变量在赋值的那一刻,就已经决定了它是什么类型。
所以如果你这样使用,就会有编译错误:
var a = ;
a = "Test";
object之所以能够被赋值为任意类型的原因,其实都知道,因为所有的类型都派生自object. 所以它可以赋值为任何类型:
object a = ;
a = "Test";
那么dynamic呢?
它是C#引入的新类型,它的特点是申明为dynamic类型的变量,不是在编译时候确定实际类型的, 而是在运行时。
所以下面的代码是能够通过编译的,但是会在运行时报错:
dynamic a = "test";
a++;
上面代码内部处理的过程是怎样的呢?
首先, dynamic类型赋值为字符串"test", 运行++操作的时候,.net会去寻找当前的赋值类型string中是否支持++操作,发现不支持,出现异常。
所以,如果这样修改一下,就可以让代码正常运行起来
dynamic a = "test";
a = ;
a++;
三. dynamic的用法
1 直接使用该类型,可以非常方便的插入属性, 方法
static void Main(string[] args)
{
dynamic person = new System.Dynamic.ExpandoObject();
person.Name = "cary";
person.Age = ;
person.ShowDescription = new Func<string>(() => person.Name + person.Age); Console.WriteLine(person.Name + person.Age + person.ShowDescription());
Console.ReadLine();
}
2 枚举所有成员
foreach (var property in (IDictionary<String, Object>)dynEO)
{
Console.WriteLine(property.Key + ": " + property.Value);
}
3 简化反射
常用的处理反射的例子:
object calc = GetCalculator();
Type calcType = calc.GetType();
object res = calcType.InvokeMember( "Add", BindingFlags.InvokeMethod, null, new object[] { , });
int sum = Convert.ToInt32(res);
使用dynamic之后:
dynamic calc = GetCalculator();
int sum = calc.Add(, );
四,使用dynamic的注意事项
有了dynamic,.net就以及有了动态类型的优势,但是由于对于dynamic类型的所有操作,都是在运行时确定的,所有错误无法在编译时候出现,使用的时候,就需要非常小心。
因为dynamic是类型,所以如果函数接受的是确定类型的参数,是不能传入dynamic类型的,这样会有编译错误。比如:
public int Add(int a, int b){
return a + b;
}
dynamic test1 = ;
dynamic test2 = ;
Add(test1, test2);
下面是对上面的例子的修正,谢谢Alan@Net. 大家可以实验一下
另外,在我们自己在写函数时,最好不要将dynamic类型作为函数的参数,这就像是使用object作为函数参数一样,会为程序的维护带来后续的麻烦。
没有人能够确定使用者传入的是什么,而且编译时候不会有问题。如果错误出现在运行时,就有可能是灾难。
理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用的更多相关文章
- [转]理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用
阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 一. 为什么是它们三个? 拿这三者比较的原因是它们在使用的时候非常相似.你 ...
- var, object, dynamic的区别以及dynamic的使用
var, object, dynamic的区别以及dynamic的使用 理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用 2013-06- ...
- (转载)【C#4.0】dynamic和var及object
dynamic a = 10;a = a + 10;Console.WriteLine(a.GetType()); 此段代码会输出 System.Int32,第二行不需要类型转换,因为在运行时识别类型 ...
- var, object, dynamic的区别以及使用(转载)
var, object, dynamic的区别以及使用 阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 拿这三者比较的原因 ...
- var, object, dynamic的区别以及使用
var, object, dynamic的区别以及使用 阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 拿这三者比较的原因 ...
- 【C# 基础概念】C# 4 dynamic - var, object, dynamic的区别以及dynamic的使用
阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 一. 为什么是它们三个? 拿这三者比较的原因是它们在使用的时候非常相似.你 ...
- dynamic和var的区别
1.var声明一个局部变量只是一种简化语法,它要求编译器根据一个表达式推断具体的数据类型. 2.var只能用于声明方法内部的局部变量,而dynamic可用于局部变量,字段,参数. 3.表达式不能转型为 ...
- 弱类型dynamic与var
dynamic与var都可代替任何类型 var关键字是C# 3.0开始新增的特性,称为推断类型. 1.必须在定义时初始化 2.一但初始化完成就不能再给变量赋与初始化值类型不同的值 3.var要求是局部 ...
- dynamic与var
dynamic与var示例 var是一种语法省略写法,编译器会根据上下文推断出正确的类型. , , , , , , , }; foreach (var item in scores) { Consol ...
随机推荐
- 统计和分析系统性能【IO CPU 内存】的工具集合
统计和分析系统性能[IO CPU 内存]的工具集合 blktrace http://www.oschina.net/p/blktrace 获取磁盘写入的信息 root@demo:~/install/p ...
- win7显示不是正版系统的解决方法
十一长假回来,打开电脑就变成这样了.现在的我已经学会了不再逃避问题,要学着解决问题,就在网上搜集了有关这方面的信息.说是下载一个激活工具就可以了.我就试着下载了,但是不知道为什么下了几个激活工具都不管 ...
- 关于Fragment你所需知道的一切!
转载自刘明渊 的博客地址:http://blog.csdn.net/vanpersie_9987 Fragment 是 Android API 中的一个类,它代表Activity中的一部分界面:您可以 ...
- Feathers UI 性能优化
Feathers UI作者写的 http://joshblog.net/2013/feathers-performance-tips/
- RHEL 6.6安装桌面环境GNOME
在测试服务器(Red Hat Enterprise Linux Server release 6.6)需要安装桌面系统环境,于是选择GNOME桌面环境安装. 一:检查系统的运行级别以及是否安装了桌面环 ...
- .NET应用架构设计—服务端开发多线程使用小结(多线程使用常识)
有一段时间没有更新博客了,最近半年都在着写书<.NET框架设计—大型企业级框架设计艺术>,很高兴这本书将于今年的10月份由图灵出版社出版,有关本书的具体介绍等书要出版的时候我在另写一篇文行 ...
- 对express中引入文件时提示Error: Cannot find module错误的理解
打算写个小demo,在引入一个routes文件时,一直提示Error: Cannot find module('./routes')的错误,经过一番了解. 如果要把整个文件夹下所有的模块都引进来 v ...
- Tomcat关闭日志catalina.out
catalina.out文件会越来越大,对系统的稳定造成了一定的影响.conf/logging.properties 一般在部署Tomcat后,运行久了,catalina.out文件会越来越大,对系统 ...
- 解密FFmpeg播放track mode控制
上一篇文章(http://www.cnblogs.com/yangdanny/p/4421130.html)我们解决了在FFmpeg下如何处理H264和AAC的扩展数据,根据解出的NALU长度恢复了H ...
- ::before和::after伪元素的用法
一.介绍 css3为了区分伪类和伪元素,伪元素采用双冒号写法. 常见伪类——:hover,:link,:active,:target,:not(),:focus. 常见伪元素——::first-let ...