Connect(); 2016

第 31 卷,第 12 期

Visual Studio 开发 - Visual Studio 2017 RC 中可提升工作效率的增强功能

作者:Kasey Uhlenhuth; 2016

如果想要提高工作效率,就必须在每日执行的任务上节省更多的时间或精力。Visual Studio 2017 RC 通过实现自动化任务,改进导航,以及根据代码质量和状态提供即时反馈,使工作效率得到很大提升。

通过“Roslyn”项目,经过 6 年不懈努力,重新构建 C# 和 Visual Basic 编译器,使得 Visual Studio 在方便 .NET 开发人员进行重构、代码生成、代码分析、导航、测试和调试方面取得了巨大进步。Visual Studio 2017 RC 利用 Roslyn 上的 Visual Studio 2015 投资,创造出了大量超酷的新功能。

导航代码

当开发人员探查 bug 时,会发现重构的影响,或需要处理不熟悉的基本代码,他们将依赖于代码导航的准确性和易用性。本版本极大的改进了导航体验,包括“查找所有引用”、“转到”和“缩进参考线”,从 A 导航到 B 更加快捷自信,减少分散注意力(甚至在大型基本代码中也会如此)。

以前,“查找所有引用”会发现某个符号的所有使用之处,然后在“结果”窗口中以简单、普通列表的形式输出结果。现在,如图 1 所示,可以对引用进行着色,以及以分层显示的方式进行排列,并能够自定义分组、排序、筛选和搜索,帮助用户快速找到所需的特定引用,即使列表中有多个引用时也可如此。此外,将鼠标悬停在某个引用上时,会显示工具提示,让你实际前往之前查看将导航到的位置。如果需要多次运行“查找所有引用”但需要保留原始结果(例如,调查并深入了解重构的影响),对于这种情况,可以保存或“锁定”该命令的结果。

“查找所有引用”的改进包括着色、自定义组织和悬停预览
图 1“查找所有引用”的改进包括着色、自定义组织和悬停预览

为节省更多时间,可以学习使用便捷的键盘快捷方式,如图 2 所示。

图 2 常规导航的键盘快捷方式

转到定义 窥视定义 查找所有引用 转到实现 转到全部(文件/类型/成员/符号)
F12 Alt+F12 Shift+F12 Ctrl+F12 Ctrl+T 或 Ctrl+,

 

在本版本中,另一个实现重大改进的功能是“转到”(以前为“导航到”)。“转到全部”是一个快速、全面的搜索,可搜索解决方案中的任何文件、类型、成员或符号声明。通过搜索栏底部的图标,可以按组筛选结果或者调整搜索范围,如图 3 所示。(但是,如果相比于鼠标,你更喜欢使用键盘的话,也可以利用查询语法,通过键入简单的前缀即可直接进行筛选)。通过右下角的齿轮图标,可以自定义一些设置,其中包括搜索栏的放置、包含突出显示结果的文件的实时预览,以及每个结果的其他文件信息。

使用图标或查询语法按文件、类型、成员或符号筛选结果
图 3 使用图标或查询语法按文件、类型、成员或符号筛选结果

最后,可以从常用的 Productivity Power Tools 扩展识别“缩进参考线”。现在,作为核心产品的一部分,这些点式灰色竖线作为代码中的结构参考线,以便在你的可视范围内提供上下文。当将鼠标悬停在底部大括号上时,即可着色预览至顶部匹配大括号的当前代码块;当将鼠标悬停在参考线上时,即可着色预览围绕且包含匹配顶部大括号的代码。这些功能旨在无需滚动或导航即可更好地查看代码“地域”和上下文。“缩进参考线”还可与 Visual Studio 中的现有大纲显示功能一起使用,甚至可提供更多可扩展和可折叠的区域。

另外,还可以在滚动条上启用“缩略图模式”。这可将滚动条转换为代码的“缩略图”,可以查看整个文档(包括错误、断点等等)的缩图版本。将鼠标悬停在“缩略图”的任意部分上时,会显示文档中该点的代码预览。

同样,可以学习使用有用的键盘快捷方式来提高效率,如图 4 所示。

图 4 “转到”的键盘快捷方式

  转到全部 转到行 转到文件 转到类型 转到成员 转到符号
快捷方式 Ctrl+T 或 Ctrl+, Ctrl+G Ctrl+1,F Ctrl+1,T Ctrl+1,M Ctrl+1,S
查询前缀 无前缀 : f t m #

读写代码

除了导航以外,开发人员在读写代码上也会花费大量时间。Visual Studio 2017 RC 侧重于促进编写正确的代码,以及维持开发人员的基本代码的可读性。本版本在 Visual Studio 2015 功能的基础上,IntelliSense 体验更加强大、更加注重重构和代码修复,可自定义代码样式配置和实施。

IntelliSense Visual Studio 的目标是协助而不是阻碍当今所用的各种代码编写工作流。Visual Studio 可帮助你提高工作效率的最为明显的方法之一是,使用 IntelliSense(请参见图 5)。Visual Studio 2017 RC 更新了 Intelli­Sense 体验,提供多个增强功能:智能预选、筛选和 XAML 支持。

IntelliSense 现在具有突出显示和筛选功能
图 5 IntelliSense 现在具有突出显示和筛选功能

智能预选将确定代码中某个位置所需的“目标类型”,并将在匹配该类型的 IntelliSense 完成列表中预先选择项。这加快了键入流,消除了必须在给定位置确定预期类型的麻烦。通过 IntelliSense 筛选,可以按类别筛选完成列表,例如,可以筛选扩展方法或仅查看事件。当处理在完成列表中有许多项的大型基本代码时,或者处理不熟悉的代码时,该功能将有助于提升工作效率。

最后,本版本还提供了全新的 XAML IntelliSense 体验,可帮助开发人员快速正确地绑定以及仅查看相关信息。 这个更加智能的完成体验包括:使用 x:Bind 绑定事件、路径和函数时的完成;camelCase 匹配支持(例如,“RTB”将以“RichTextBox”的形式完成);命名空间前缀自动完成。

代码分析 Visual Studio 2015 引入了实时代码分析功能,可支持“即输即显示”代码反馈。这样,即可在错误生成之前及早了解问题,而不是积累一堆可能永远无法修复的问题。为解决实时代码分析中标识的错误,可以使用灯泡菜单或快捷方式“Ctrl+.”访问代码修复和重构。Visual Studio 2017 RC 在实时分析和代码修复方面也取得了进步,它扩大了可用的重构和代码修复集,还引入了代码样式分析器,可在键入代码时立即发现代码中的样式问题。

Visual Studio 2015 包括一些核心重构:提取方法或接口、更改方法签名、内联临时变量、引入局部变量和删除不必要的使用和导入。Visual Studio 2017 RC 扩展了重构和修复集,可帮助维护可读的基本代码以及促进开发工作流。例如,有相当多的开发人员都会首先在单个文件中编写所有类、接口和其他类型,然后,再将每个类型提取到一个具有匹配名称的文件中。Visual Studio 2017 RC 利用重构选项“将类型移至匹配文件”加快了这一过程。 可以期待的其他重构包括:

  • 同步文件和类型名称
  • 将属性转换为方法
  • 使用对象初始值设定项
  • 将 null-check + throw 转换为使用 ?? + throw
  • 将 string.Format 转换为内插字符串
  • 使方法同步
  • 添加缺少事例
  • 添加大括号

此外,本版本还引入了一些针对 XAML 的基本代码分析和修复。使用与 C# 和 Visual Basic 中相同的灯泡机制,可以分类捡出和删除不必要的命名空间,以及在 XAML 文件中添加缺少的命名空间。 

维护一致、可读的基本代码是一项极具挑战性的工作。力争获得可读基本代码的理由非常充分: 如果所有代码看上去一致,新开发人员上手就会更加轻松;如果所有代码看上去一致,代码审阅就可将重点放在逻辑上而非格式和样式的繁琐细节上。Visual Studio 2017 RC 建立了一种通过内置样式规则和自定义命名约定配置代码样式的方法。

在 RC 中,可以转至“工具 | 选项 | 文本编辑器 | [C#/Basic] | 代码样式 | 常规”,查看内置的可配置样式规则,其中包括首选 var 而非显式类型,首选预定义而非框架类型,首选 this 而非 nothing。每个规则都带有说明、可配置的首选项和可配置的严重性。各个不同级别的严重性的使用方式如下:

  • 错误在编辑器中显示为红色波浪线,出现在错误列表中,将中断生成。
  • 警告在编辑器中显示为绿色波浪线,出现在错误列表中,仅当启用配置“将警告视为错误”时才中断生成。
  • 建议在编辑器中显示为灰色圆点,出现在错误列表中,不会中断生成(请参见图 6)。
  • “无”在编辑器中不显示,不出现在错误列表中,也不会中断生成。

在编辑器中强制执行团队样式和命名约定,以便在违反规则时获得实时诊断
图 6 在编辑器中强制执行团队样式和命名约定,以便在违反规则时获得实时诊断

由于命名样式的首选项在整个 .NET 开发人员社区中大相径庭,因此,可以创建自己的自定义命名约定,以便针对自己的团队强制执行。Visual Studio 2017 RC 提供了一组默认设置,可以将这些默认设置配置为强制执行团队约定,其中包括:成员(除字段外)应为 PascalCase,类型应为 PascalCase,接口以“I”开头,异步方法以“Async”结尾。 可以配置这些默认设置并向其中添加项,为此,请转至“工具 | 选项 | 文本编辑器 | [C#/Basic] | 代码样式 | 命名”。命名规则放置在一个网格中便于配置,就像标准样式规则一样(请注意,此处顺序非常重要 - 应用第一个匹配的样式规则)。

要添加自定义命名规则,请单击规则网格底部的绿色加号(“+”)按钮,打开规则创建对话框。之后,可以使用默认规范(例如,“所有类”)和样式(例如,“使用前缀 _”)创建自定义命名规则。如果内置的规范和样式不足以拼凑成所需的命名约定,可以编写自己的命名约定。

此外,还可以从编辑器调整自己的样式规则,为此,请按“Ctrl+.”触发灯泡菜单,从菜单中选择规则修复,然后单击实时代码预览中的齿轮图标。

测试代码

在选择足够多的测试以确保代码正确的同时,又希望运行尽可能少的测试以便减少等待测试结果的时间,在二者权衡之间,支持单元测试会造成一个有趣的紧张局面。正确性与时间之间的这种折衷,常常让开发人员感到徒劳无益和令人沮丧。为了减轻这种压力,Visual Studio 2017 RC 引入了针对 C# 和 Visual Basic 的实时单元测试(请参见图 7)。

实时单元测试可以按“通过”、“失败”还是“无测试”修改代码提供即时反馈
图 7 实时单元测试可以按“通过”、“失败”还是“无测试”修改代码提供即时反馈

实时单元测试可以分析在运行时生成的数据,以在编辑后仅运行受影响的测试,并根据编辑器中测试状态提供即时反馈。 这些内联可视化将逐行显示:

  • 如果一行可执行代码被至少一个失败测试命中,则在前面以红色“x”标记。
  • 如果一行可执行代码被所有通过测试命中,则在前面以绿色对号装饰。
  • 如果一行可执行代码被无测试命中,则在前面以蓝色短划线标记。

实时单元测试提供的实时代码覆盖率和测试结果信息省去了手动选择和运行测试的麻烦。实时反馈还可在更改导致程序中断的情况下立即向你发出通知,即,如果内联可视化从绿色对号变为红色 x,则会知道你中断了测试。可以随时将鼠标悬停在对号或 x 上,查看哪些测试命中指定行。此外,还可以在悬停工具提示中单击测试,直接导航至其所在位置。

如果你是进行测试驱动开发的团队成员,则实时单元测试可将工作流以游戏化方式完成。换句话说,所有测试最初为红色以失败状态标记,随着每个方法的实施,在这些测试成功后,就会看到它们变为绿色标记。对于其他所有开发人员,实时单元测试会针对他们中断代码时的情况提供可视反馈。

调试代码

如果所有努力都无效后,开发人员会依靠调试以帮助他们确定问题的来源。Visual Studio 2017 RC 减少了单步执行程序和下钻至异常信息所需的操作数,从而节省了时间。

正如其名,“运行时单击”会一直执行程序,直到到达目标代码行,并在调试模式下中断。从根本上说,该功能通过将所有这些操作组合成一个单击,让开发人员从不断添加、命中和删除临时断点的工作中解放出来。要使用该功能,只需按绿色的“运行到此”图标即可,调试模式下,该图标显示在鼠标悬停位置的代码行左侧。

或许,调试器中取得最大工作效率改进的是新的异常帮助器。这个重新设计的对话框中,在最上面显示异常的最重要信息,如内部异常详细信息和返回 null 的表达式,如图 8 所示。Visual Studio 2017 RC 还支持在特定的情况下对异常类型禁止中断,这样,可以在调试时忽略从第三方库或某些 .dll 引发的异常。

新的异常帮助器使开发人员无需下钻至下拉列表来查找最重要的信息和操作
图 8 新的异常帮助器使开发人员无需下钻至下拉列表来查找最重要的信息和操作

总结

Visual Studio 2017 RC 侧重于通过减少时间和工作量来提高工作效率。我非常高兴能够与大家分享此版本中的这些新增及改进功能:改进使用“转到”和“查找所有引用”进行的导航;增强 C# 和 VB 以及 XAML 中的 IntelliSense 功能;扩展了实时代码分析,包含更多的重构和修复并增加了代码样式;利用实时单元测试以交互方式进行测试;通过新的异常帮助器提高调试工作的效率。我期待听到你们的反馈,并希望你们获取富有成效的 Visual Studio 2017 RC 体验。


Kasey Uhlenhuth就职于 Microsoft 公司的 .NET 和 Visual Studio 团队,担任项目经理一职,目前负责现代化 C# 开发人员体验工作。之前,她负责 C# 交互和 Node.js Tools for Visual Studio 工作。可以通过 kaseyu@microsoft.com 与她联系,或关注她的 Twitter:@kuhlenhuth

衷心感谢以下 Microsoft 技术专家对本文的审阅: David Carmona、Kevin Pilch-Bisson 和 Mark Wilson-Thomas
Kevin Pilch 在 Microsoft 公司从事开发人员工具已有约 15 年之久。  在此期间,他负责 C# 和 VB IDE 体验,包括 IntelliSense、格式化、重构、着色等功能。最近,他担任 Microsoft Roslyn 项目的 IDE 团队经理一职。他喜欢与孩子待在一起,进行马拉松训练以及打曲棍球。  但也喜欢喝啤酒,吃巧克力饼干。你可以在 Twitter 找到 Kevin:@Pilchie

Mark Wilson 是一位在 Visual Studio IDE 团队工作的项目经理,负责 Visual Studio 编辑器。他在开发人员工具上有 10 多年的经验,包括面向 Office、SQL、WPF 和 Silverlight 的工具。你可以在 Twitter 找到他:@MarkPavWT