2017 年 11 月

第 33 卷,第 11 期

Visual Studio - Visual Studio for Mac 中的代码编辑和调试

作者 Alessandro Del Del | 2017 年 11 月

Visual Studio for Mac 是 Microsoft 的一个强大的全新本机开发环境,完美体现了其移动优先、云优先的愿景。它可以帮助你使用现有的 .NET 技能和偏爱的编程语言(如 C# 和 F#)通过 Xamarin 和 .NET Core 构建跨平台应用程序、通过 Unity 构建游戏。可以在 msdn.com/magazine/mt790182 找到 Visual Studio for Mac 简介。在本文中,我将重点介绍该代码编辑器中的一些强大功能以及帮助提高工作效率的调试工具。

Roslyn 提供技术支持的代码编辑器

通过 Visual Studio for Mac,可以在 macOS 上使用 C# 和 F# 编写代码。让这成为可能的原因是,IDE 利用 .NET 编译器平台,也称为项目 “Roslyn” (github.com/dotnet/roslyn)。Roslyn 提供了开源跨平台 .NET 编译器,后者提供了丰富的代码分析 API。与在 Windows 上的 Visual Studio 2015 和 2017 中一样,Roslyn 为 Visual Studio for Mac 中的代码编辑器提供技术支持,为语法着色、IntelliSense、实时代码问题检测、修复和重构提供了增强的编码体验。官方文档解释了如何在一般情况下使用代码修复和重构 (bit.ly/2jKt69D),因此在本文中,我将更加专注于功能,例如生成类型、删除冗余代码、导航代码、添加对自定义语言和代码片段的支持。所有这些功能都可用于 Xamarin 和 .NET Core 项目。

动态生成类型

代码编辑器中最高效的功能之一就是能够在编码时生成新的类型,而不会失去对活动编辑器的关注。例如,可以编写尚不存在的类型的名称,当代码编辑器将类型名称突出显示为代码问题时,可以右键单击它(或按 Alt+Enter),选择“快速修复 | 生成类型”。图 1 显示基于生成名为 Person 的类型的示例。

在活动编辑器中生成新类型

图 1 在活动编辑器中生成新类型

第一个选项“在新文件中生成类 Person”,将在名为 Person.cs 的新文件中生成一个名为 Person 且包含内部修饰符的新类。第二个选项“生成类 Person”,将在当前文件中生成一个名为 Person 且包含内部修饰符的新类。第三个选项“生成嵌套类 Person”,将生成一个名为 Person、嵌套在当前在代码编辑器中处于活动状态的类型中的新专用类(在这种情况下,新类将在 Program 类中生成)。然后,可以手动更改内部或专用修饰符,也可以右键单击修饰符,然后选择“快速修复”。在任何情况下,新类都是通过一个空的构造函数生成的。第四个选项“生成新类型”,将显示一个对话框,可以在其中指定要创建的类型(类、接口或枚举)、访问修饰符和目标。而且还不仅限于此,你可以使用相同的方法向新生成的类型添加成员。可以简单地分配或调用尚不存在的属性、字段或方法,并利用快速修复来轻松添加一个属性,如图 2 中所示,其中显示了如何将名为 LastName 的新属性添加到 Person 类。“生成变量 LastName”选项会根据当前上下文提供不同的建议。

生成新成员

图 2 生成新成员

在这种情况下,代码正在进行分配,所以代码编辑器建议你生成一个新的属性或字段。基于这些代码,代码编辑器还将为新生成的成员分配正确的类型,这意味着它将生成一个字符串类型的属性(或字段)。代码编辑器可以分析方法调用并生成匹配的方法签名。此功能是代码重构工具的一部分,可帮助在编写代码时专注于代码。

删除冗余代码

Visual Studio for Mac 中的代码编辑器还突出显示了冗余代码,这些代码不是必需的,也没有得到利用。冗余代码很容易识别,因为它显示为灰色。在后台,基于某些源分析规则突出显示了冗余代码,这些规则会导致冗余代码被视为问题。(你可以控制这些规则,但这不在本文讨论范围内。) 大多数情况下,可以基于不必要的使用指令查找冗余代码示例,但冗余代码识别不限于此。例如,一个空的构造函数和内部修饰符在图 3 中突出显示为冗余代码。

删除冗余代码

图 3 删除冗余代码

如果右键单击一些冗余代码(通过其较浅的颜色识别),则可以选择“快速修复”,Visual Studio 将显示一个用于删除不必要代码的代码修复程序。另外,你将会看到一个名为“选项”的子菜单,该菜单可以让你:

  • 取消当前问题检测。
  • 在 Visual Studio 首选项中进一步配置分析规则。
  • 在文档、项目或解决方案级别针对多个相同类型的问题应用代码修复程序。

同样,在前面的示例中,可以轻松地修复类型定义的冗余内部修饰符(内部修饰符实际上是 C# 中的默认修饰符)。该方法适用于在编辑器中突出显示冗余代码的任何分析规则。

导航代码

在代码文件之间以及代码文件中的成员之间进行导航很常见,并且使用内置强大的导航工具可以显著提高工作效率。Visual Studio for Mac 提供了许多可靠的工具,可以让你更轻松地在文件、类型和成员之间导航。首先,可以通过按 Ctrl+Tab 快速在代码文件之间移动。此操作会显示一个弹出窗口,可以在其中看到解决方案中的文件列表。再次同时按住 Ctrl 和 Tab 可以向下滚动列表,然后在释放时所选文件将在编辑器中打开。对于源代码导航,接下来的小节将讨论那些非常有用但鲜为人知的高效功能。

“查找所有引用”和导航工具

“查找所有引用”工具可以让你检索解决方案中对类型或成员的所有引用。要查看这个工具的运行情况,只需在代码编辑器中右键单击一个类型或成员名称,然后选择“查找所有引用”。引用显示在“搜索结果”面板中,如图 4 所示。

查找类型或成员引用

图 4 查找类型或成员引用

在“搜索结果”面板中,可以看到(从左到右)包含引用的项目、包含位置的代码文件、包含引用对象的源文本以及源文件的完整路径名。可以双击一个引用,代码编辑器将打开相应的代码文件并将光标置于选定的事件上。注意“文本”列中的源代码是如何具有基本的语法着色的。“查找所有引用”功能非常强大,但有时你可能需要根据特定的类型和成员特征来筛选搜索结果。要做到这一点,可以使用导航工具。要调用导航工具,先右键单击类型或成员,然后选择“导航”。你将看到一个显示以下搜索选项的子菜单:

“查找所有重载的引用”可以查找方法及其重载的所有引用。

****“基本符号”可以让你查找基本类型和接口的列表,从你对其调用导航工具的类型继承或实施该类型。至于方法,导航工具将查找当前方法替代的方法列表。

“派生符号”可以让你查找从对其调用导航工具的类型继承的类型列表。至于方法,它会查找方法列表,这些方法会替代你对其调用导航工具的方法。

****“扩展方法”查找你对其调用导航工具的类型的扩展方法以及在当前解决方案中定义的所有扩展方法。

“成员重载”类似于扩展方法,但它可以查找当前解决方案中定义的方法重载列表。

****“实现成员”,如果在抽象类或接口上调用,则显示实现该类型或接口的类型和成员的列表。

导航工具完全像“查找所有引用”一样在“搜索结果”面板中显示搜索结果。

滚动条和小地图模式

代码编辑器的滚动条显示表示代码问题的彩色标记,例如警告和错误、断点、待办事项和顶部的彩色点,如果活动文件包含错误,则点为红色;如果活动文件包含警告,则为黄色;如果没有发现问题,为绿色。另外,滚动条提供了所谓的小地图模式。启用此模式后,滚动条会显示源代码预览,以便轻松导航,如图 5 所示。

滚动条小地图模式

图 5 滚动条小地图模式

右键单击滚动条并选择“显示小地图”即可启用小地图模式。可以单击地图上的某个区域,代码编辑器随即将光标移动到适当的位置。要禁用小地图模式,请再次右键单击滚动条,然后选择“显示任务”。小地图模式对长文件特别有用,可帮助你获得整个文件的可视化表现形式。

在代码文件中浏览对象

Visual Studio for Mac 提供了在代码文件中轻松浏览类型和成员的可视方式。每个代码编辑器窗口都显示了可以单击的痕迹,以查看在活动编辑器中定义的类型列表;当你选择一个类型时,有额外的选项卡可以让你显示其成员列表。此外,可以使用“文档大纲”面板在活动文件中获取类型结构的可视化表现形式(请参阅图 6)。

在代码文件中浏览对象

图 6 在代码文件中浏览对象

注意不同的图标如何代表不同类型的成员。你可能已知道“文档大纲”面板具有显示 UI 的可视化层次结构的功能,但是你也可以使用它来获取类型结构的视图,这一点非常有用。双击文档大纲内的对象,编辑器即会将光标移到其定义。

使用代码片段

Visual Studio for Mac 支持 IntelliSense 代码片段,即预编写的代码块模板,可以对其进行自定义以满足你的需求。如果你有在 Windows 上使用 Visual Studio 的经验,你就知道代码片段是什么。在 Visual Studio for Mac 中,可以通过两个选项来插入代码片段。第一个选项是右键单击代码编辑器,然后选择“插入模板”。可用的代码片段列表将显示出来,你只需选择一个需要的即可。第二个方法是在键入时从 IntelliSense 完成列表中选取代码片段。图 7 的示例中突出显示了一个代码片段(可以按两次 Tab 插入代码片段)。

添加代码片段

图 7 添加代码片段

代码片段用 (…) 图标表示,这样可以马上识别它们。在这两种情况下,将鼠标悬停在代码片段名称上时,会显示用来描述其用途的工具提示。通过 Visual Studio for Mac,可以在 IDE 中创建新的自定义代码片段并编辑现有代码片段,而无需使用外部工具。为此,请在 Visual Studio 菜单中选择“首选项”,然后在“首选项”对话框中找到并选择文本编辑器下的“代码片段”项。你会看到按语言分组的代码片段列表。如果选择一个现有片断,只需按“编辑”按钮即可编辑代码。如果单击“添加”,将为你提供用来新建代码片段的选项。这是在“新建模板”对话框中完成的,该对话框为你提供了键盘快捷键、说明、MIME 类型和语言组,当然还有源代码。图 8 显示了一个示例。

创建自定义代码片段

图 8 创建自定义代码片段

请注意,$ 符号用于标记要替换的标识符,而 $selected$$end$ 表达式用于分隔当前片段。标记要替换的标识符时,还可以在对话框右侧的框中提供关于标识符本身的附加信息,例如默认值和描述其含义的工具提示。完成后,只需单击“确定”并关闭“首选项”对话框。此时,你的新代码片段位于代码片段库中,可以通过 IntelliSense 在代码编辑器中使用。值得注意的是,可以编辑现有的片段来指定键盘快捷键(如果尚不可用)。这样,你可以在代码编辑器中使用键盘快捷键并更快地插入代码片段。如果你像我一样大量使用代码片段,那么选择在 IDE 中创建片段将为你节省大量时间。

添加自定义语言

Visual Studio for Mac 中你会喜欢的一个功能是添加新的语言,这些语言不是默认配置的语言,其语法基于 TextMate 和 Sublime Text 事实标准。事实上,Visual Studio for Mac 支持这两种标准,并允许添加提供编辑功能(例如语法着色、代码片段和文字自动完成)的语言包。例如,假设你想添加用来编辑 Swift 文件的语法支持,这在 Mac 上可能非常有用。在 TextMate 或 Sublime Text 中,安装 Swift 语言包,然后将语言包的程序包导出到磁盘。然后,可以将语言包导入到 Visual Studio for Mac。要完成此操作,请使用“首选项”对话框的“语言包”节点。在这里,你可以单击“添加”并选择之前导出的语言包。此时,你将能够打开 .swift 文件(或其他文件类型,具体取决于导入的包),并利用语法着色和代码块折叠等功能。

如果选择的语言包中有任何代码片段,代码编辑器还允许你插入。显然,Visual Studio for Mac 不支持编译源文件或基于外部语言包构建和发布应用程序。你可以执行的操作是使用“选项”菜单中的“编辑自定义工具”命令自动执行外部工具,例如编译器。

通过面板和调试类调试工作效率

调试非常重要,Visual Studio for Mac 附带每个开发人员所需的一流调试工具,助你以高效的方式构建高质量的应用程序。官方文档 (bit.ly/2xgJkx0) 描述了最常用的工具,如断点、数据可视化工具和条件流控制。我将介绍一些你可能想要了解的其他功能,特别是如果你熟悉在 Windows 上的 Visual Studio 中调试并希望在 Mac 上看到相同的工具。我们从 System.Diagnostics.Debug 类开始,该类允许你从 C# 代码将表达式评估打印到应用程序输出板,而不会中断应用程序的执行。假设有一个 .NET Core 控制台应用程序,它使用以下代码等待用户输入:

string inputString = Console.ReadLine();
Debug.WriteLine($"The entered string is {inputString.Length} characters long");

Debug.WriteLine 方法将表达式打印到应用程序输出板,如图 9 所示,而不会停止应用程序的执行。在这种情况下,表达式是一个内插字符串,它包含用户输入的字符串的长度。

打印到应用程序输出板的评估结果

图 9 打印到应用程序输出板的评估结果

而且也不限于 WriteLine 方法;实际上,可以使用所有其他支持的方法,例如 Assert、Equals、Fail、Write、WriteIf 和 WriteLineIf(有关详细信息,请参阅 bit.ly/2ydS8jO)。

在 Visual Studio for Mac 中,还可以通过其他方法在调试时评估表达式和检查对象值。可以使用断点和数据可视化工具,但是也可以使用监视板,其目的是提供一种方法来以可视方式监视变量、方法和表达式。在中断模式下,监视窗口会自动启用,你可以在其中单击以添加要监视的新对象。图 10 显示了基于一个属性值的示例。

通过监视板监视对象

图 10 通过监视板监视对象

对于监视的每个对象,你都可以看到对象成员及其值。也可以单击值并对其进行更改,以便观察在使用不同对象值时代码的行为。监视板还提供数据可视化工具的快捷方式,可以通过眼睛和铅笔图标来识别。你还会发现其他两个调试板也非常有用:线程板和调用堆栈板,它们都显示在图 11 中。

通过线程板和调用堆栈板监视线程和方法调用

图 11 通过线程板和调用堆栈板监视线程和方法调用

线程板显示正在运行中的线程列表,对了解应用程序各种线程暂停的代码位置非常有用。它显示了线程 ID、引用每个线程的代码的名称和位置。如果线程没有名称,也可以为线程输入名称。“调用堆栈”板显示方法调用的层次结构,你可以使其显示调用解决方案中没有的代码,例如互操作帧。要完成此操作,请右键单击“调用堆栈”板并启用“显示外部代码”选项。通过利用所有这些功能,你将拥有一套完整而强大的调试工具,它们与断点、本地板和数据可视化工具一起为你提供对 .NET Core 和 Xamarin 解决方案的深度控制。

总结

Visual Studio for Mac 不仅可以帮助你在 MacOS 上使用 Xamarin 和 .NET Core 构建移动设备和云的跨平台应用程序,还可以提供编写高质量代码所需的所有高效工具。这包括代码编辑器和调试工具中的高效功能,这些功能使你能够开始轻松地使用 IDE,特别是如果你拥有在 Windows 上使用 Visual Studio 的经验时更是如此。


Alessandro Del Sole* 自 2008 年起被评为 Microsoft MVP。他已经 5 次获得年度 MVP 这一殊荣,发表过很多关于 Visual Studio .NET 开发的书籍、电子书、指导视频和文章。Del Sole 是专门从事 .NET 和移动应用开发、培训和咨询的资深 .NET 开发者。他最近撰写了一本名为“Beginning Visual Studio for Mac”(bit.ly/2hsRxYx) 的书,这本书即将出版。你可以关注他的 Twitter @progalex。*

衷心感谢以下 Microsoft 技术专家对本文的审阅:Mikayla Hutchinson


在 MSDN 杂志论坛讨论这篇文章