C# 4.0的一些新特性

  vs2010正式版4月12日发布了,前几天我也下了一个,但这几天都没有时间好好试用一下,今天针对C#语言的新特性使用了一下,感觉还不错,有几个新特性和大家分享一下,希望我没有太火星……

一、新关键词——dynamic

    在新版本的C#中,dynamic关键词是一个很重要的新特性,现在你可以创建动态对象并在运行时再决定它的类型。而且.net 4.0为CLR加入了一组为动态语言服务的运行时环境,称为DLR(Dynamic Language Runtime动态语言运行时),这使得C#这种静态类型语言可以在 .NET Framework 中开发动态语言并为与其它动态语言提供互操作性了。DLR架构见下图:
DLR架构
关于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());  
  7. /*  
  8. 输出:  
  9. System.Int32  
  10. System.Double  
  11. System.String  
  12. */   


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

  1. object  obj = 10;  
  2. obj = obj + 10;  


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

  1. object  obj = 10;  
  2. obj = (int )obj + 10;  


但是这样就有个类型安全的问题了,加入我类型不是转换成int,而是string,那么编译器一样可以编译通过,但是运行时就会抛出异常:

  1.              object  obj = 10;  
  2.             obj = (string )obj + 10;  
  3. /*  
  4. Unhandled Exception: System.InvalidCastException: Unable to cast object of type  
  5. 'System.Int32' to type 'System.String'.  
  6. */   


由此可见,你要使上面代码正确运行,你必须得正确的进行类型的显式转换,就仅仅因为不这样做的话,编译器不让你通过而已。为了解决这个问题,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);  


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

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

二、可选(或默认)参数

    貌似这个特性在C#1.0就已经有很多人问过了,但直到4.0才有。现在你可以在方法定义的时候为参数指定一个默认值。调用方法的时候既可以像平时那样传入参数,也可以直接跳过不传入,这样的话,就使用默认值传到方法里。例如:

  1. static   void  Main( string [] args)  
  2. {  
  3.     TestMethod();  
  4.     TestMethod(3);  
  5. }  
  6. static   void  TestMethod( int  i = 10)  
  7. {  
  8.     Console.WriteLine(i);  
  9. }  

    值得注意一点的是,可选参数必须放在所有参数的最后。这里就有个问题了,加入我某个方法有两个参数,两个都是可选参数,而我调用的时候只想传入第二个参数,怎么办呢?我们来试试。

  1. static   void  Main( string [] args)  
  2. {  
  3.     TestMethod("hello" );  
  4. }  
  5. static   void  TestMethod( int  i = 10,  string  s =  "ojlovecd" )  
  6. {  
  7.     Console.WriteLine("i:{0},s:{1}" , i, s);  
  8. }  

但很可惜,编译通不过,这个问题,利用下面的新特性就可以解决了。

三、命名参数

在之前版本的C#中,方法定义的参数顺序必须与方法调用时的参数顺序一 致,即方法Method(int i, string s)调用时就必须第一个传入int,第二个传入string,而现在,这个规矩可以被打破了。你可以自己随便什么顺序传入,这也在一定程度上提高了代码的 可读性。例子:

  1. static   void  Main( string [] args)  
  2. {  
  3.     TestMethod2(s: "ojlovecd" , i: 26);  
  4. }  
  5. static   void  TestMethod2( int  i,  string  s)  
  6. {  
  7.     Console.WriteLine("i:{0},s:{1}" , i, s);  
  8. }  

这样一来,上面的那个问题就可以迎刃而解了:

  1. static   void  Main( string [] args)  
  2. {  
  3.     TestMethod(s: "hello" );  
  4. }  
  5. static   void  TestMethod( int  i = 10,  string  s =  "ojlovecd" )  
  6. {  
  7.     Console.WriteLine("i:{0},s:{1}" , i, s);  
  8. }  

四、提高COM的互操作性

基于以上三点新特性,COM的互操作性也被提高了。以后不用再写如下丑陋的代码:

  1. var excelApp =  new  Excel.Application();  
  2. // . . .   
  3. excelApp.get_Range("A1""B4" ).AutoFormat(  
  4.     Excel.XlRangeAutoFormat.xlRangeAutoFormatTable3,  
  5.     Type.Missing, Type.Missing, Type.Missing,  
  6.     Type.Missing, Type.Missing, Type.Missing);  

现在只需这么写就搞定了:

 

  1. excelApp.Range[ "A1""B3" ].AutoFormat(  
  2.     Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);  

顺带一句,这段代码用到了另一个叫做“索引属性”的新特性,更多关于这个特性的信息可以参考http://msdn.microsoft.com/en-us/library/ee310208%28VS.100%29.aspx  这个特性只能用于COM互操作上,你不能创建自己的索引属性。

好了,就先分享这么多吧,以后有什么新发现再与大家分享吧~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值