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

一、新关键词——dynamic

在新版本的C#中,dynamic关键词是一个很重要的新特性,现在你可以创建动态对象并在运行时再决定它的类型。而且.net 4.0为CLR加入了一组为动态语言服务的运行时环境,称为DLR(Dynamic Language Runtime动态语言运行时),这使得C#这种静态类型语言可以在 .NET Framework 中开发动态语言并为与其它动态语言提供互操作性了。DLR架构见下图:

关于DLR的更详细信息,可以参考msdn:http://msdn.microsoft.com/en-us/library/dd233052(VS.100).aspx

先来看看dynamic的一个例子:

C# code
dynamic dyn = 1;
Console.WriteLine(dyn.GetType());
dyn = 1.234;
Console.WriteLine(dyn.GetType());
dyn = "ojlovecd";
Console.WriteLine(dyn.GetType());
/*
输出:
System.Int32
System.Double
System.String
*/

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

C# code
object obj = 10;
obj = obj + 10;

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

C# code
object obj = 10;
obj = (int)obj + 10;

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

C# code
object obj = 10;
obj = (string)obj + 10;
/*
Unhandled Exception: System.InvalidCastException: Unable to cast object of type
'System.Int32' to type 'System.String'.
*/

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

C# code
dynamic dyn = 10;
dyn = dyn + 10;
Console.WriteLine(dyn);

dyn = 10.02;
dyn = dyn + 10;
Console.WriteLine(dyn);

dyn = "ojlovecd";
dyn = dyn + 10;
Console.WriteLine(dyn);

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

C# code
dynamic dyn = 10;
dyn = dyn + DateTime.Now;
Console.WriteLine(dyn);
/*

Unhandled Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Oper
ator '+' cannot be applied to operands of type 'int' and 'System.DateTime'
at CallSite.Target(Closure , CallSite , Object , DateTime )
at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site
, T0 arg0, T1 arg1)
at ConsoleApplication3.Program.Main(String[] args) in D:\CSharpProj\ConsoleAp
plication3\ConsoleApplication3\Program.cs:line 26

*/

二、可选(或默认)参数

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

C# code
static void Main(string[] args)
{
TestMethod();
TestMethod(3);
}
static void TestMethod(int i = 10)
{
Console.WriteLine(i);
}

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

C# code
static void Main(string[] args)
{
TestMethod("hello");
}
static void TestMethod(int i = 10, string s = "ojlovecd")
{
Console.WriteLine("i:{0},s:{1}", i, s);
}

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

三、命名参数

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

C# code
static void Main(string[] args)
{
TestMethod2(s: "ojlovecd", i: 26);
}
static void TestMethod2(int i, string s)
{
Console.WriteLine("i:{0},s:{1}", i, s);
}

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

C# code
static void Main(string[] args)
{
TestMethod(s: "hello");
}
static void TestMethod(int i = 10, string s = "ojlovecd")
{
Console.WriteLine("i:{0},s:{1}", i, s);
}

四、提高COM的互操作性

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

C# code
var excelApp = new Excel.Application();
// . . .
excelApp.get_Range("A1", "B4").AutoFormat(
Excel.XlRangeAutoFormat.xlRangeAutoFormatTable3,
Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing);

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

C# code

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

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

[转].NET4.0新特性集合贴的更多相关文章

  1. ASP.NET4.0新特性

    原文:ASP.NET4.0新特性 在以前试用VS2010的时候已经关注到它在Web开发支持上的一些变化了,为此我还专门做了一个ppt,当初是计划在4月12日那天讲的,结果因为莫名其妙的原因导致没有语音 ...

  2. 浅谈Tuple之C#4.0新特性那些事儿你还记得多少?

    来源:微信公众号CodeL 今天给大家分享的内容基于前几天收到的一条留言信息,留言内容是这样的: 看了这位网友的留言相信有不少刚接触开发的童鞋们也会有同样的困惑,除了用新建类作为桥梁之外还有什么好的办 ...

  3. c# 6.0新特性(一)

    写在前面 接近年底了,基本上没什么活了,就学点新东西,就想着了解下c# 6.0的新特性.在code project上看到了一篇不错的文章,就准备翻译一下,顺便照着学习学习.废话不多说,直奔主题. 原文 ...

  4. [C#]6.0新特性浅谈

    原文:[C#]6.0新特性浅谈 C#6.0出来也有很长一段时间了,虽然新的特性和语法趋于稳定,但是对于大多数程序猿来说,想在工作中用上C#6.0估计还得等上不短的一段时间.所以现在再来聊一聊新版本带来 ...

  5. 返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller

    原文:返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller [索引页][源码下载] 返璞归真 asp.net mvc (7) - asp.net ...

  6. C#5.0新特性

    C#5.0新特性 C#5.0最大的新特性,莫过于Async和Parallel. 以往我们为了让用户界面保持相应,我们可以直接使用异步委托或是System.Threading命名空间中的成员,但Syst ...

  7. Django 2.0 新特性 抢先看!

    一.Python兼容性 Django 2.0支持Python3.4.3.5和3.6.Django官方强烈推荐每个系列的最新版本. 最重要的是Django 2.0不再支持Python2! Django ...

  8. C#6.0,C#7.0新特性

    C#6.0新特性 Auto-Property enhancements(自动属性增强) Read-only auto-properties (真正的只读属性) Auto-Property Initia ...

  9. redis5.0新特性

    1. redis5.0新特性 1.1. 新的Stream类型 1.1.1. 什么是Stream数据类型 抽象数据日志 数据流 1.2. 新的Redis模块API:Timers and Cluster ...

随机推荐

  1. Git及github使用(二)上传项目

    接上篇中创建好的项目. 1.进入到相应的目录右键Git bash here打开客户端 2.创建一个readme文本 $ echo "# Python日常记录积累" >> ...

  2. error C1083: 无法打开包括文件: “ui_roadquery.h”: No such file or directory c:\users\administrator\desktop\g_w_j\04 开发阶段\开发工程\imcshowapp\imcshowapp\roadquery.h 5 1 IMCShowApp

    1.我这里出现的原因是忘记将项目文件添加进入项目中,在项目中右击添加即可

  3. 函数的属性和方法, apply和call的区别及bind的使用

    ==>我的新博客中 http://www.suanliutudousi.com/2017/08/27/%E5%87%BD%E6%95%B0%E7%9A%84%E5%B1%9E%E6%80%A7% ...

  4. unittest(2)

    测试用例执行顺序 1.setUp和tearDown相关 setUp:表示前置条件,它在每一个用例执行之前必须会执行一次        setUp可以理解为我们需要自动化测试时,需要打开网页窗口,输入对 ...

  5. 01、requests 基本使用

    requests模块的基本使用 基于网络请求的模块. 环境的安装:pip install requests 作用:模拟浏览器发起请求 分析requests的编码流程: 1.指定url 2.发起了请求 ...

  6. java.sql.SQLException: validateConnection false

    -- :: --- [Create-] com.alibaba.druid.pool.DruidDataSource : create connection error java.sql.SQLExc ...

  7. 面试39 MySQL读写分离

    (1)如何实现mysql的读写分离? 其实很简单,就是基于主从复制架构,简单来说,就搞一个主库,挂多个从库,然后我们就单单只是写主库,然后主库会自动把数据给同步到从库上去. (2)MySQL主从复制原 ...

  8. 应用Dubbo框架打造仿猫眼项目 理解微服务核心思想

    1:传统应用带来的问题 单一业务开发的迭代问题              扩容困难              部署回滚困难2:微服务概述 微服务是一种将业务系统进一步拆分的架构风格          ...

  9. StringBuilder 和 StringBuffer类

    通常在涉及到StringBuilder和StringBuffer时中任何一个时,都应该想到另外一个并且在脑海中问自己是否用另外一个更加合适. 为什么这么说,请继续往下看,当然如果你已经对二者烂熟于胸自 ...

  10. C++ vector操作--往列表中添加或更新内容

    有个列表,往里面添加内容,如果对象已存在,只更新其属性,否则添加新一项. #include <iostream> #include <string> #include < ...