【IT168 专稿】C#作为Visual Studio的当家花旦,每次Visual Studio和.NET Framework的升级都会给她带来很多激动人心的特性,让这位微软力捧的明星更加耀眼夺目。这个Visual Studio 2010 CTP中就包含了C# 4.0的动态查询(Dynamic Lookup)、命名参数/可选参数、COM互操作简化等等新特性。
除了语言本身的升级外,在Visual Studio的IDE上微软也下了功夫,提供了很多实用的功能,来帮助程序员们高效地开发越来越复杂的应用。
在接下来的几篇文章中,我们从语言本身和IDE两个方面,来介绍VS2010 CTP所带来的针对托管语言的新特性。diy
第一篇:Visual Studio 2010 下一个Visual Studio 6.0
第二篇:Visual Studio 2010 的自定义开始页
第三篇:Visual Studio 2010中的多显示器支持
第五篇:C# 4.0中的动态类型和动态编程
第六篇:使用Visual Studio 2010的特性支持TDD
第七篇:Visual Studio 2010特性支持Office
第八篇:Visual Studio 2010的Quick Search特性
第九篇:Visual Studio 2010中的C++0x新特性
第十篇:Visual Studio 2010中的C++ IDE增强
第十一篇:使用Visual C++ 2010创建Ribbon界面
第十二篇:Visual C++ 2010创建Ribbon界面(下)
第十三篇:Visual Studio 2010与VS2008全面比较
每次Visual Studio的升级,总是伴随着大量新的语言特性的引入和IDE的更加高效智能。这些新特性的引入,令无数跟随Microsoft的程序员“痛并快乐着”,快乐的是新特性的引入,无疑会提高开发效率,痛苦的是又要开始学习新技术了,但是不管怎样,这就是“程序人生”。这几篇文章的意义,就是想让大家的快乐多一点点,痛苦少一点点,人生就更加美好了。话不多说,开始我们的新历程吧。
在Visual Studio 2010 CTP中,Visual Basic 10、C# 4.0以及IDE所引入的新特性主要包括:
特性 | 描述 |
自动实现属性 (Auto-Implemented Properties) | 在Visual Basic 10中,我们可以简单地通过一行就完成标准属性的定义。自动实现属性和 C# 中的相同概念是完全一致的。 |
集合初始值设定 (Collection Initializers) | Visual Basic引入了新的关键字From来简化集合的初始值设定,这将大大简化一些繁琐的初始化工作。 |
隐式换行 (Implicit Line Continuations) | 我们都知道,在Visual Basic中是使用换行符”_”显式地进行换行的。现在,在很多情况下我们可以不使用换行符”_”而实现隐式换行。 |
No-PIA 部署 (No-PIA) | 我们在编写基于 Microsoft Office 的应用程序时,往往需要部署一堆 VSTO 的 Runtime 程序集,但有时候我们编写一些应用程序时,仅仅调用了这些 Interop 程序集中很少的功能。例如仅仅保存或打开了一个 Excel 表格等,如果每次部署这样的应用程序都需要分发整个 PIA(Primary Interop Assemblies)的话就显得多此一举。在新的 Visual Basic 中,可以将一个 PIA 程序集的属性设置为 Embedded 来将其用到的对象引用内嵌到我们自己的程序集中,这样就避免了分发整个 VSTO Runtime 的臃肿部署方式。 |
内联 Lambda 表达式 (Inline Lambda Expressions) | 在Visual Basic 9中我们使用Lambda表达式 时,无论是否真正需要,都要一个返回值。在Visual Basic 10中,返回值已经不再是必须的,这就更C#保持了一致。 另外,在Visual Basic 10中, Lambda 表达式可以包含多条语句以处理比较复杂的逻辑,而无需像以前那样把逻辑处理交给其他的函数来处理。 |
特性 | 描述 |
动态类型 (Dynamic Types) | C# 4.0引入了对动态类型的迟绑定(late binding) ,当你得到一个动态类型的对象时,不管他是来自COM还是IronPython、HTML DOM还是反射,只需要对其进行操作即可,运行时会帮你指出针对特定的对象,这些操作的具体意义。 这将带来很多新的应用,例如简化对Silverlight应用程序中HTML DOM对象的访问。 |
无PIA特性 (No-PIA) | 主互操作程序集(Primary Interop Assembly)是从COM接口生成的大型.NET程序集,用于协助完成强类型的互操作。无PIA特性允许你在设计时使用PIA,而无需在运行时使用它们。C#编译器会将程序中实际用到的PIA中的一小部分直接编译到程序集中,在运行时无需加载PIA,这样可以简化程序的部署,同时也可以减少内存的使用。 |
Office开发 (Office Programmability) | C# 4.0支持命名参数和可选参数,这将大大简化COM互操作的语法,使得Office开发更加简单。 |
特性 | 描述 |
调用树 (Call Hierarchy) | 在Visual Studio 2010 CTP中,我们可以从解决方案中的任何一个成员函数直接跳转到调用它的函数或者它所调用的函数。这极大地方便了我们理解程序的执行流程。 |
即用即生成 (Generate from Usage) | 新的代码编辑器将根据用户的使用,在后台自动地生成新的类型和成员。 |
高亮引用 (Highlight Reference) | 在新的代码编辑器中,我们可以将光标停留在标识符上,代码编辑器将高亮所有对应的标识符引用。使用Ctrl + Shift + Up和Ctrl + Shift + Down组合键,我们可以在标识符的多个引用之间跳转。这个新特性在我们查找某些对象的使用情况时非常有用。 |
快速查找 (Quick Search) | Visual Studio 2010引入了一个简化后的快速查找对话框,在这个快速查找对话框中,我们可以搜索解决方案中的文件,符号,注释等等。使用Ctrl+”,”快捷键可以调出这个快速查找对话框。 |
上面关于托管语言和IDE新特性的介绍,都非常概括而抽象,为了让大家有一个直观的感受,下面我们以一些实际的例子,来为大家展示这些新特性。本回我们首先介绍Visual Studio IDE的调用继承树。
写程序离不开调试,调试离不开理清程序的执行流程。在以前的Visual Studio版本中,我们几乎都是调试的时候通过调用栈来查找函数间的调用关系,帮助调试的。调用栈虽然好用,但是只能在调试时使用,同时也只能串行,只有一条执行路径。另外,随着现代应用程序越来越复杂,调用栈已经无法满足我们分析程序逻辑的需要。所以在Visual Studio 2010中,微软为我们提供了新的程序逻辑分析工具:调用继承树(Call Hierarchy)窗口。
为了体验调用继承树窗口给我们带来的便利,我们可以打开Visual Studio 2010 CTP虚拟机中自带的示例项目DinnerNow – Management。在解决方案浏览器中,我们双击PSWorkflowMonitor.cs这个文件,将其在代码编辑器中打开。然后找到其中的LoadWorkflowInstance函数,在这个函数上右键单击,在弹出的上下文菜单中选择“View Call Hierarchy”:
图1 选择“View Call Hierarchy”
这样,我们就可以打开LoadWorkflowInstance函数的调用继承树窗口:
图2 调用继承树窗口
在调用继承树窗口中,我们可以像“爬树”一样,在这棵调用继承树的各个节点和对应的代码之间任意跳转:
• 跳转到代码
在调用继承树窗口中,我们可以在函数上点击右键,选择弹出菜单中的“Go To Definition”,就可以直接跳转到相应的代码。
图3 跳转到代码
同时我们可以注意到调用继承窗口的右边是“Detail Pane”,其中显示了当前选中函数所有的调用位置,我们只要双击其中的调用记录,就可以跳转到相应的函数调用位置。
图4 Detail Pane
• 创建或者删除调用继承树
当程序比较复杂的时候,我们的调用继承树也会“枝繁叶茂”,这样不利于我们的分析。在这种情况下,我们就可以把一个根节点中我们感兴趣的子节点设置为新的根节点,这样可以简化调用继承的深度,更加利于我们的分析。
图5 创建新节点
当我们不再需要某个根节点的时候,为了节省空间,我们也可以删除多余的根节点。
• 改变调用继承搜索的范围
默认情况下,调用继承会搜索整个解决方案中的调用情况,如果我们的解决方案比较复杂,这就会使得调用继承树非常复杂,引入很多意义不大的调用关系。为了简化调用继承树,我们可以改变调用继承的搜索范围,将其限制在解决方案,当前项目或者当前文档。
图6 改变搜索范围