浅谈Dynamic 关键字系列之一:dynamic 就是Object

简介:

C# 4.0提供了一个dynamic 关键字,那么什么是dynamic,究竟dynamic是如何工作的呢?

 

从最简单的示例开始:

static void Main(string[] args)
        {
            dynamic dyn = 1;
            object obj = 1;

            //在编译时将鼠标放到 ”dyn”  和”obj”中可以发现:
             // dyn:局部变量 dynamic (dyn)
            // obj: 局部变量object (obj)
            System.Console.WriteLine(dyn.GetType());
            System.Console.WriteLine(obj.GetType());
        }
 

运行这段代码将显示 dyn 和obj 的运行时类型:

 
 
 

在WriteLine方法后面增加两行:

dyn = dyn + 3;

obj = obj + 3;

编译:

image

可以看到对于表达式 obj +3 ,编译器器报告了错误,但是不会报 dyn+3 编译。

编译器不会检查包含dyn的表达式,原因在于 dyn 是 dynamic。

 

 

类型转换

修改Main代码如下:

dynamic dyn = (dynamic)1;

int j = (int)dyn;

 

可以看到1被强制转换成dynamic,然后又被强制转换回int.

然而dynamic可以隐式的转换成任何类型,并且也可以从其他类型中转换回来,

所以上面的代码和下面的等价:

dynamic dyn = 1;

int j = dyn;

 

修改Main代码增加如下代码:

//下面这句话会无法通过编译,typeof 运算符无法用在动态类型上
//Console.WriteLine(typeof(dynamic)); 
Console.WriteLine(typeof(List<dynamic>));
如果你是typeof(dynamic)会报
但是如果你写的是List<dynamic> 那么输出结果如下:
 

可以看到输出时System.Object

 

 

微软对此的解释是:

在大多数情况下, dynamic 类型与 object 类型的行为是一样的。 但是,不会用编译器对包含 dynamic 类型表达式的操作进行解析或类型检查。 编译器将有关该操作信息打包在一起,并且该信息以后用于计算运行时操作。在此过程中,类型 dynamic 的变量会编译到类型 object 的变量中。 因此,类型 dynamic 只在编译时存在,在运行时则不存在。






本文转自LoveJenny博客园博客,原文链接:http://www.cnblogs.com/LoveJenny/archive/2011/07/04/2097031.html,如需转载请自行联系原作者
目录
相关文章
Dump dynamic object in LinqPad
Just like: dynamic paper = MockPaper(); LINQPad.Extensions.Dump(paper); //paper.Dump(); Use LINQPad.Extensions.Dump replace obj.Dump 本文基于Creative Commons Attribution 2.5 China Mainland License发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名http://www.cnblogs.com/luminji(包含链接)。
543 0
|
vr&ar
dynamic、object、var 之间的区别
dynamic .net 4.0  动态类型   ExpandoObject 应用   dynamic Customer = new ExpandoObject(); Customer.
757 0
|
5月前
|
Java
java判断Object对象是否为空demo
java判断Object对象是否为空demo
|
5天前
|
JavaScript
js 字符串String转对象Object
该代码示例展示了如何将一个以逗号分隔的字符串(`&#39;1.2,2,3,4,5&#39;`)转换为对象数组。通过使用`split(&#39;,&#39;)`分割字符串并`map(parseFloat)`处理每个元素,将字符串转换成浮点数数组,最终得到一个对象数组,其类型为`object`。
|
1月前
|
存储 设计模式 Python
Python中的类(Class)和对象(Object)
Python中的类(Class)和对象(Object)
27 0
|
1月前
|
存储 JavaScript
JS中Map对象与object的区别
JS中Map对象与object的区别
|
5月前
判断Object对象是否为空
判断Object对象是否为空
|
2月前
|
Java 流计算
在Flink实时任务中,POJO(Plain Old Java Object)对象的模式演进可能会引起不兼容的问题
【2月更文挑战第6天】在Flink实时任务中,POJO(Plain Old Java Object)对象的模式演进可能会引起不兼容的问题
19 3
|
3月前
|
JavaScript 前端开发 测试技术
Proxy vs Object.defineProperty:哪种对象拦截机制更适合你?
Proxy vs Object.defineProperty:哪种对象拦截机制更适合你?
|
3月前
|
存储 JavaScript 前端开发
【JavaScript】<面向对象Object>函数方法&对象创建&原型对象&作用域解析
【1月更文挑战第17天】【JavaScript】<面向对象Object>函数方法&对象创建&原型对象&作用域解析