C# Dynamic关键字之:解析dynamic就是Object
2013-05-14 09:19
966 查看
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 的运行时类型:
System.Int32
System.Int32
在WriteLine方法后面增加两行:
dyn = dyn + 3;
obj = obj + 3;
编译:
从最简单的示例开始:
复制代码 代码如下:
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 的运行时类型:
System.Int32
System.Int32
在WriteLine方法后面增加两行:
dyn = dyn + 3;
obj = obj + 3;
编译:
可以看到对于表达式 obj +3 ,编译器器报告了错误,但是不会报 dyn+3 编译。
编译器不会检查包含dyn的表达式,原因在于 dyn 是 dynamic。
.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }
类型转换
修改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)会报typeof运算符无法用在动态类型上的错误,
但是如果你写的是List<dynamic> 那么输出结果如下:
可以看到输出时System.Object。
微软对此的解释是:
在大多数情况下, dynamic 类型与 object 类型的行为是一样的。 但是,不会用编译器对包含 dynamic 类型表达式的操作进行解析或类型检查。 编译器将有关该操作信息打包在一起,并且该信息以后用于计算运行时操作。在此过程中,类型 dynamic 的变量会编译到类型 object 的变量中。 因此,类型 dynamic 只在编译时存在,在运行时则不存在。
您可能感兴趣的文章:
- C#动态对象(dynamic)详解(实现方法和属性的动态)
- C#中Dynamic和Dictionary性能比较
- C#中dynamic关键字的正确用法(推荐)
- 深入C# 4.0 新特性dynamic、可选参数、命名参数的详细介绍
- C# Dynamic关键字之:dynamic为什么比反射快的详解
- C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的应用(下)
- C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的应用(上)
- C# Dynamic关键字之:调用属性、方法、字段的实现方法
- C# dynamic关键字的使用方法
- C#使用dynamic类型访问JObject对象
相关文章推荐
- 浅谈Dynamic 关键字系列之一:dynamic 就是Object(转)
- 浅谈Dynamic 关键字系列之一:dynamic 就是Object
- 浅谈Dynamic 关键字系列之一:dynamic 就是Object
- C#4.0的dynamic和var及object关键字辨析
- c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic
- [翻译]关键字“dynamic”和“object”(及“var”)有什么不同?
- [翻译]关键字“dynamic”和“object”(及“var”)有什么不同?
- C#4.0的dynamic和var及object关键字辨析
- C# 4.0 Dynamic关键字全解析
- 黑马程序员--Object-C常用关键字解析
- 浅谈Dynamic 关键字系列之三(下):ExpandoObject,DynamicObject,DynamicMetaObject
- (转)C#4.0的dynamic和var及object关键字辨析
- JSON 之 SuperObject(16): 实例 - 解析 Google 关键字搜索排名
- 浅谈Dynamic 关键字系列之三:ExpandoObject, DynamicObject, DynamicMetaObject
- 浅谈Dynamic 关键字系列之三(上):ExpandoObject, DynamicObject, DynamicMetaObject
- 浅谈Dynamic 关键字系列之三(上):ExpandoObject, DynamicObject, DynamicMetaObject
- C# 4.0 Dynamic关键字全解析(转)
- Java中的static关键字解析
- Java并发编程:volatile关键字解析(三.Java内存模型)
- Volatile关键字深入解析