作为一个对代码美学有着严格要求的开发者,经常需要对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的类似技巧。