(转)C#4.0的dynamic和var及object关键字辨析

http://www.cnblogs.com/Mainz/archive/2011/03/10/1980060.html

   1:  dynamic a = 10;
   2:  a = a + 10;
   3:  Console.WriteLine(a.GetType());

此段代码会输出 System.Int32,第二行不需要类型转换,因为在运行时识别类型。dynamic 在后台使用 System.Object 类型。但与 object 不同的是,动态类型不需要在编译时执行显式转换操作,因为它仅在运行时识别类型。关于dynamic和object的详细区别,看看《What is the difference between “dynamic” and “object” keywords?》

在 C# 类型系统中,dynamic 实际上是一个静态类型,这个关键字使得C# 获得了动态功能,同时仍然作为静态类型化语言而存在。这句话如何理解,就要理解它是如何实现动态绑定的,看看《Dynamic Binding in C#4.0》

下面的代码会通过编译,但运行时报错。因为当您使用 dynamic 关键字时,您就告诉编译器关闭编译时检查。

   1:  dynamic a = "test";
   2:  a++;

来看看var关键字,从C#3.0开始加入的这个,我们对JavaScript的var比较熟悉,看看C#的var:

   1:  var a = 10;
   2:  a = a + 1;
   3:  Console.WriteLine(a.GetType());

此段代码会输入 System.Int32, 第二行不需要类型转换,var是强类型的。当使用 var 关键字声明变量时,将在编译时根据初始化字符串推断该变量的类型。 在运行时无法更改该变量的类型。

但要注意的是,var 关键字不过是一个指令,它让编译器根据变量的初始化表达式推断类型;var 不是类型。

最后看看object,关键字 object 表示 System.Object 类型,它是 C# 类层次结构中的根类型。 此关键字经常在编译时无法确定对象类型时使用,而这种情况经常在各种互操作性情形中发生。

但用object要避免类型转换(显式或隐式)

   1:   object a = 10;
   2:   a = (int)a + 10;
   3:   a = "test";

Dynamic可以用来干嘛?

发挥你的想象力,我可以想到的是可以用来做脚本支持,比如office支持用vba脚本写插件,那我们也可以用这个实现可编写脚本的应用。

第二个用处就是用动态方法包,动态方法包就是可在运行时添加和删除属性及方法的对象。System.Dynamic命名空间实际上是 DLR 的一部分,可以用 System.Dynamic.ExpandoObject 和 System.Expando.DynamicObject 类与新的 dynamic 关键字相结合实现自己需要的东东。

第三个用处是替代反射。有个例子,通过反射调用一个计算器对象的Add方法,先前不知道计算器的类型,只知道有个Add方法,代码是这样的:

   1:  object calc = GetCalculator();
   2:  Type calcType = calc.GetType();
   3:  object res = calcType.InvokeMember( "Add", BindingFlags.InvokeMethod, null, new object[] { 10, 20 });
   4:  int sum = Convert.ToInt32(res);

现在不用反射用dynamic就代码简洁了:

   1:  dynamic calc = GetCalculator();
   2:  int sum = calc.Add(10, 20);

这样看来Dynamic还是挺有意思的。

时间: 2024-11-10 03:56:39

(转)C#4.0的dynamic和var及object关键字辨析的相关文章

理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用

原文:理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用 阅读目录: 一. 为什么是它们三个 二. 能够任意赋值的原因 三. dynamic的用法 四. 使用dynamic的注意事项 一. 为什么是它们三个? 拿这三者比较的原因是它们在使用的时候非常相似.你可以用它们声明的变量赋任何类型的值. 看看下面的示例: var a = 1; object b = 1; dynamic c = 1; 你还可以使用关键字为它们赋上更加复杂的类型 v

C# dynamic与var的区别

1.C#编程总结(十四)dynamic 2.var和dynamic的区别及如何正确使用dynamic?

Debian (Jessie 8.0) 的修复pip AttributeError: 'module' object has no attribute 'PROTOCOL_SSLv3'

升级到最新的stable后,python的pip还是老的. 在安装一些包的时候,报错了 Traceback (most recent call last): File "/usr/bin/pip", line 9, in <module> load_entry_point('pip==1.5.6', 'console_scripts', 'pip')() File "/usr/lib/python2.7/dist-packages/pkg_resources.py

libevent-2.0.so.5: cannot open shared object file: No such file or directory

centos 安装软件后出现: ./usr/local/bin/memcached 解决libevent-2.0.so.5: cannot open shared object file: No such file or directory解决方法   1. 用以下命令LD_DEBUG=libs /usr/local/bin/memcached -v  查看寻找的路径是哪里 [[email protected] bin]# LD_DEBUG=libs /usr/local/memcached/b

eclipse 使用tomcat7.0建立Dynamic Web Project 时 web.xml的问题

最近使用Eclipse helios版本结合tomcat7.0建立动态的web项目时,发现在WEB-INF下的web.xml没有了. 解决方案: 建立web项目时,建到第三个下一步时,将 Generate web.xml deployment descriptor 这个选项选中即可.

var, function, object, parameter怎么理解?

var是用来存放data value的(container).data type包括number, string, array, math, date等(其中string, array, math, date都是object). function是a block of code,优势:通过不同的arguments(和parameters一个意思)来实现code reuse. object是用来存放多个values,并以name: value/property: property value出现:

【Shell】linux中shell变量$#,[email&#160;protected],$0,$1,$2的含义解释 &amp;&amp; set 关键字使用

linux中shell变量$#,[email protected],$0,$1,$2的含义解释 摘抄自:ABS_GUIDE 下载地址:http://www.tldp.org/LDP/abs/abs-guide.pdf linux中shell变量$#,[email protected],$0,$1,$2的含义解释: 变量说明: $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返回值) $- 使用Set命令设定

dynamic和匿名类和var的混合使用 没提示照样点

using System;using System.Collections;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace ConsoleApplication5{ class Program { public static void aa() { Console.Write(1); } static void Main(str

AS3.0 扑克牌乱序排列法洗牌

package { /* *@ClassName:package::PokerMain *@Intro:这是一个初始化1-52扑克牌,然后进行乱序排列进行洗牌: *@Author:非若 *@Date:2015.07.22 *@LanguageVersion:ActionScript 3.0 * */ import flash.display.Sprite; public class PokerMain extends Sprite { //设置扑克牌总数 private var NUM:Numb