我们可以看到方法GetSomeList()定义的返回类型是dynamic, 上面例子里实际返回的类型是List。而事 实上这里可以返回任何类型,int,
string, StringBuilder都可以,因为我们定义了它的返回类型是“动态”的。
再看myObject, 我们调用了它的方法"NonExistsMethod”,正如其名,这个方法在任何地方都是不存在的。
但是上述程序可以在Visual Studio2010里编译通过,没有任何错误!如果我们把NonExistsMethod替换成实际存在的方法,譬如Sort(),
运行也是没有问题的。也就是说,如果某个变量是dynamic类型的,那么编译器允许你调用任何存在或者不存在的方法。
这些方法会一直到运行时才在被绑 定,如果不存在,当然就会有异常抛出。
看到这里相信大家觉得dynamic和某个东西很像,没错,就是和object很像!一个dynamic类型的引用和object一样,可以指向任 何类型,
GetSomeList()方法就是这样的用法。但是又似乎有点不同,譬如我们可以调用任何方法,极大地增强了动态性。
编译上述例子并在 reflector里查看过后,我们可以发现C#其实在编译上确实把它作为了object, GetSomeList() 会被编译成:
而对dynamic对象的调用会被编译成:
我们可以看到在神秘的dynamic背后,NonExistsMethod被处理成了动态绑定用的字符串。
而一个新的类型 System.Runtime.CompilerServices.CallSite被引入在.Net 4.0里用来支持这样的动态绑定。
总结: dynamic
1可以和动态语言互操作,可以同时享受动态语言的灵活和.Net的强大
2可以支持自顶而下的开发方式,从顶层的架构开始搭起会很容易,调用不存在的方法(甚至这个类都根本不存在)编译也没有问题。
2 .命名参数
命名参数的语法为:
参数名称1:参数值1,参数名称2:参数值2…
例如以下代码:
可以看到由于在调用时使用了命名参数,参数的位置就不在重要了。
3. 可选参数
方法、构造函数、索引器和委托的定义可以指定其参数为必选的还是可选的,在调用时必须提供必选参数,但是可以省略可选参数。
还可以使用System.Runtime.InteropServices.OptionalAttribute特性类定义可选参数,该类从1.0时代就已经包含在基类库中了。
每一个可选参数的定义都包含默认值(默认值必须是常量),如果在调用时没有指定该参数,则使用默认值。例如以下代码:
在所有必须参数后面定义可选参数,如果在调用时提供了某个可选参数的值,那么必须提供该可选参数之前所有可选参数的值(如果此参数之
前有可选参数),而不允许使用逗号分隔的形式提供参数,即以下调用是错误的:
CreateUser(“admin”,“adminpassword”,,true);
而必须写成:
CreateUser(“admin”,“adminpassword”,20,true);、
或者更好的解决办法是使用命名参数:
CreateUser(“admin”,“adminpassword”,isLocked:true);
4 .增强的COM互操作性特性
C# 4.0在COM互操作性支持方面提供了很多改进,使得你现在在.NET代码中可以更容易地调用COM对象了,需要执行的类型转换更少
了,ref关键字不再需要,也不再需要主互操作程序集或PIA,从本质上讲,C# 4.0提供了大量的新特性,特别是在COM互操作方面更是下足
了功夫,在前一篇文章中谈到的动态查询和命名/可选参数的支持,帮助提高了与COM API如Office自动化API互操作的体验。
例如,下面是C# 4.0以前的版本打开一个Word文件的代码:
在最后的open调用中,你可以看到需要传递大量的可选参数以满足函数调用,随着C# 4.0中可选和命名参数的引入,现在做同样的事情,
需要的代码要少得多了。
下面是C# 4.0中用来打开Word文档的代码:
VS2010 新特性如下介绍
Visual Stuidio 2010提供了更好的用户体验,令流程更加自然,更加便于理解。
◆明了的UI设计
◆减少复杂度
◆增强的编辑器
◆对浮动文档和窗口的更好支持
◆增强的文档targeting
◆行为回馈的焦点动画
Web开发
Web开发工具功能得到提升。
◆高性能以及标准化的JavaScript IntelliSense引擎
◆“一键部署”,能够快速将文档和设置发布到将要部署的网站上
◆Silverlight的全面支持
云计算
Visual Studio 2010包含了Windows Azure工具,可以简单的实现在微软云平台上的开发,调试以及部署。
◆C#以及VB云服务项目的模版
◆更改Service Role设置的工具
◆本地开发整合Development Fabric以及Development Storage服务
◆在Development Fabric下的对Cloud Service Roles的调试
◆建立云服务软件包
◆浏览Azure Services Developer Portal
更多数据库支持
现在,开发者除了SQL Server,还可以在IBM DB2以及Oracle数据库下工作。
IBM大力提供了一个Database Schema Provider(DSP),这个DSP可以让DB2在Windows,Linux或Unix平台上工作。在VSTS 2010开发版中,它可以实现离线设计,开发,测试以及更改管理等功能。
Quest Software也做了类似的工作,他们的DSP令Oracle实现了相同的效果。
并行编程
并行编程被简化,本地代码和管理代码的开发者都能够建立具有创造力的应用。
◆并行编程的IDE支持
◆本地C++库,可以使用Lambda函数,并与STL相匹配
◆.NET框架的并行扩展,提供了对必要数据以及任务并行的支持,声明数据并行化,以及其他
◆多核硬件的资源管理,以及Concurrency Runtime允许的任务计划
◆并行调试窗口和图解外观