定制Visual Studio生成代码的样式

作为一个对代码美学有着严格要求的开发者,经常需要对Visual Studio生成的代码进行格式化和重新排序。Visual Studio提供了许多优秀的工具和技巧来帮助更高效地编写代码,但有时生成的代码样式并不符合个人偏好或公司规范。本文将介绍一种简单的方法来定制Visual Studio生成的代码样式,特别是针对C#语言的WinForm项目。

Visual Studio是一个非常强大的代码开发环境,它提供了许多内置的工具和技巧来帮助编写更好的代码。其中之一就是当创建新的项目项(如新的Web表单、用户控件等)时,它会为提供代码框架。

如果像一样,可能希望代码按照特定的方式格式化和排序。例如,个人喜欢在方法声明或if语句等处将大括号放在同一行。此外,不喜欢在创建WinForm时,初始生成的代码中包含不需要的注释。更重要的是,公司可能更喜欢在开始新源文件时使用特定的代码模板和风格规范。

在采用将要介绍的技术之前,添加新项目项后,首先需要删除和重新排列Visual Studio刚刚生成的大部分代码。虽然这并不是一个巨大的问题,但久而久之确实会变得有些繁琐。

解决方案

解决这个小问题的方案实际上非常简单。正如可能已经猜到的,Visual Studio使用模板来创建生成的代码。鉴于模板文件是以纯文本形式编写的,所要做的就是操作这些文件,直到对模板生成的内容感到满意。

以将要讨论的特定示例为例,将使用C#作为首选武器,并改变添加新WinForm时默认生成的代码,使其更符合喜好。

必要的模板文件根据它们对应的语言和要执行的功能进行存储。例如,用于创建新WinForm的模板存储在以下位置:

C:\[安装根目录]\Microsoft Visual Studio .NET\VC#\VC#Wizards\CSharpAddWinFormWiz\Templates\1033\

文件夹C:\[安装根目录]\MicrosoftVisual Studio.NET\VC#\VC#Wizards包含与Visual Studio所知道的C#向导相对应的多个文件夹。每个向导文件夹中都有一些内容,但今天感兴趣的内容位于Templates文件夹中。

将要更改的实际模板文件是:

NewWinForm.cs

注意:在更改这些文件之前,请确保已经将它们备份到一个安全的地方,以防搞砸了!倾向于将正在更改的文件的扩展名更改为.old。另外请注意,对自己安装的任何操作都是完全自担风险的。如果不确定自己知道在做什么,那么不要碰任何东西,直到感觉好些。话虽如此,这并不是什么高深莫测的事情,所以只要采取通常的预防措施,一切都会好的。

修改模板文件

现在已经备份了模板文件,打开最喜欢的文本编辑器,将看到:

using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; namespace [!output SAFE_NAMESPACE_NAME] { /// /// Summary description for [!output SAFE_CLASS_NAME]. /// public class [!output SAFE_CLASS_NAME] : System.Windows.Forms.Form { private System.ComponentModel.Container components = null; public [!output SAFE_CLASS_NAME]() { // // Required for Windows Form Designer support // InitializeComponent(); // // TODO: Add any constructor code after InitializeComponent call // } protected override void Dispose(bool disposing) { if (disposing) { if (components != null) { components.Dispose(); } } base.Dispose(disposing); } #region Windows Form Designer generated code private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.Size = new System.Drawing.Size(300, 300); this.Text = "[!output SAFE_CLASS_NAME]"; } #endregion } }

会注意到模板文件的内容与最终结果非常相似。实际上,由于文件类型仍然被列为.cs,可以在Visual Studio中打开它,并且仍然可以获得所有漂亮的语法高亮。

如果曾经在文字处理器中做过邮件合并,那么将立即明白发生了什么。上面的代码与VS为生成的代码完全相同,只是代码中放置了一些标记。例如,[!output SAFE_CLASS_NAME]这样的标记在运行时由VS用来将动态信息插入到生成的代码中。

鉴于Visual Studio使用的模板如此简单,很容易按照意愿更改模板。正如之前提到的,不喜欢默认插入的注释,更喜欢将大括号放在方法或条件语句(例如if、while、for)的同一行。此外,当创建一个新的WinForm时,喜欢将自动生成的代码放入一个区域,以便可以将其放在一边。或公司可能有一项约定,即总是在源文件的顶部放置某些信息——例如修订详细信息。让快速看看那可能是什么样子:

/* File Created by: mushentgrumbble Date: 04/02/1866 Copyright Notice: Class Description: Notes: Revision Log - Please mark significant changes in source code in the following format: Date - Time - Reviewer - Comments 11/11/03 - 2.34pm - Rebecca White - Bug #457 Fixed - Code released to testing */ using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; namespace [!output SAFE_NAMESPACE_NAME] { /// /// /// public class [!output SAFE_CLASS_NAME] : System.Windows.Forms.Form { private System.ComponentModel.Container components = null; #region Private Variables #endregion #region Properties #endregion public [!output SAFE_CLASS_NAME]() { InitializeComponent(); } #region Auto-generated code private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.Size = new System.Drawing.Size(300, 300); this.Text = "[!output SAFE_CLASS_NAME]"; } protected override void Dispose(bool disposing) { if (disposing) { if (components != null) { components.Dispose(); } } base.Dispose(disposing); } #endregion #region Event Handlers #endregion } }

正如希望的那样,代码版本在功能上是相同的,尽管已经移除、移动和添加了各种代码片段以适应偏好。

所以,这就是改变Visual Studio生成的自动代码的非常简单的方法。据了解,应该可以对其他安装的语言做同样的事情——只要四处看看能找到什么。实际上,最初并不知道这可以做到。有一天,对VS格式化代码的方式感到厌烦,所以猜想一定有某种模板系统在起作用。在Visual C#目录下四处寻找,那就是发现VC#Wizards文件夹的地方。很想知道是否有其他人有关于Visual Studio的类似技巧。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485