vs2010正式版4月12日发布了,有几个新特性分享一下……

一、新关键词——dynamic

  在新版本的C#中,dynamic关键词是一个很重要的新特性,现在你可以创建动态对象并在运行时再决定它的类型。而且.net 4.0为CLR加入了一组为动态语言服务的运行时环境,称为DLR(Dynamic Language Runtime动态语言运行时),这使得C#这种静态类型语言可以在 .NET Framework 中开发动态语言并为与其它动态语言提供互操作性了。DLR架构见下图:
.net4.0新特性
关于DLR的更详细信息,可以参考msdn:http://msdn.microsoft.com/en-us/library/dd233052(VS.100).aspx

先来看看dynamic的一个例子:

 

代码
1 dynamic dyn = 1;
2 Console.WriteLine(dyn.GetType());
3 dyn = 1.234;
4 Console.WriteLine(dyn.GetType());
5 dyn = "ojlovecd";
6 Console.WriteLine(dyn.GetType());
/*
输出:
System.Int32
System.Double
System.String
*/

 

 
可能你会说,这个效果,我用object关键字就可以了,干吗加个dynamic?那我们就来讨论一下object与dynamic的区别。
先看如下代码:
1 object obj = 10;
2 obj = obj + 10;
3  

 


这样肯定是通不过编译的,虽然obj存储的是一个整形,但是如果不进行类型转换的话编辑器肯定是不会编译通过的。所以我们就要改成:
1 object obj = 10;
2 obj = (int)obj + 10;
3  

 

 
但是这样就有个类型安全的问题了,假如我类型不是转换成int,而是string,那么编译器一样可以编译通过,但是运行时就会抛出异常 
1 object obj = 10;
2 obj = (string)obj + 10;
3
 

 

/*
Unhandled Exception: System.InvalidCastException: Unable to cast object of type
'System.Int32' to type 'System.String'.
*/

 

 

 
由此可见,你要使上面代码正确运行,你必须得正确的进行类型的显式转换,就仅仅因为不这样做的话,编译器不让你通过而已。为了解决这个问题,dynamic由此产生。它告诉编译器:“哥说啥就是啥,你甭跟我废话”。见下例:

代码
1 dynamic dyn = 10;
2 dyn = dyn + 10;
3 Console.WriteLine(dyn);
4
5 dyn = 10.02;
6 dyn = dyn + 10;
7 Console.WriteLine(dyn);
8
9 dyn = "ojlovecd";
10 dyn = dyn + 10;
11 Console.WriteLine(dyn);
12
 

 

这是object和dynamic的其中一个不同。它告诉编译器对象的类型只有在运行时才知道,编译器就不会对其进行干涉。这样你可以少写很多代码。但有一点必须强调一下:dynamic并没有增加或减少危险。当你操作对象时要用到的所有类型检查技巧(例如反射),在动态对象中一样要用到。例如,以下代码在运行时将会抛出异常:
1 dynamic dyn = 10;
2 dyn = dyn + DateTime.Now;
3 Console.WriteLine(dyn);
4

 

1 /*
2
3 Unhandled Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Oper
4 ator '+' cannot be applied to operands of type 'int' and 'System.DateTime'
5 at CallSite.Target(Closure , CallSite , Object , DateTime )
6 at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site
7 , T0 arg0, T1 arg1)
8 at ConsoleApplication3.Program.Main(String[] args) in D:\CSharpProj\ConsoleAp
9 plication3\ConsoleApplication3\Program.cs:line 26
10
11 */
12
13

 

相关文章: