生成公共属性 + 私有后备字段 + #regions 内的文档标记的代码段






2.33/5 (2投票s)
生成具有私有支持字段、链接的文档标签,并位于#regions内的属性的代码片段。能够配置类型、字段和属性的名称以及默认初始值
引言
我发现的大多数代码片段的问题是,没有一个(绝对没有一个)超出代码生成范围!有时我发现非常好的代码片段,代码编写得很好,但仅此而已。没有生成文档,没有#regions
指令!是的,我知道!没有人喜欢文档,但是当你需要向你的伙伴解释你的类/方法/等等是干什么的,或者在代码准备好后需要重新进行相同的解释,而你正在处理另一个项目时,你会记住你没有编写的文档!
#regions
是另一个问题。没有人喜欢混合“代码片段和#regions
”。在Visual Studio中,#regions
启用了具有亲和力的代码块,可以直观地放在一起,并且具有折叠和展开功能,能够专注于同一代码的不同抽象级别。
之后,我决定编写一个代码片段,用于每个程序每天都会遇到的常见任务:属性生成代码片段。这个代码片段不是一个很大的代码片段,远非如此!这个代码片段的目的仅仅是为了展示即使是一个小问题,如果得到很好的解决,也能提供很大的帮助。(“这不是一个很大的代码片段”,这个代码片段最多有46行。我还有另一个代码片段,可以在您自己的命名空间中生成一个类,其中包含自定义异常类、事件日志辅助类、性能计数器、dispose方法和文档,大约会生成3000行代码!!!)
背景
您可以使用文本编辑器或在Visual Studio内部开发代码片段事件,但是当您决定深入研究代码片段的世界时,首先要做的聪明的事情是寻找代码片段编辑器。根据我的经验,有两个免费的代码片段编辑器值得一提:“Snippet Editor”和“SnippetBuilder”,第一个是我大部分时间使用的。
当您使用文本编辑器开发代码片段时,您需要直接使用代码片段的XML标签,这可能会容易出错。编辑器会提供很大的帮助,因为它倾向于隐藏细节。提供一些语法着色(非常差!但总比没有好!),然后发布代码片段。代码片段基本上是一个* .xml *文件,但是当您发布代码片段文件时,它会被转换为一个* .vsi *,您或其他人只需双击* .vsi *文件即可直接将其导入到Visual Studio中。最重要的是:当您的代码片段启用自定义(替换)时,编辑器会提供很大的帮助!这是在激活代码片段时,能够使用用户期望的值来更改替换变量的内容的能力。
Using the Code
以下代码显示了代码片段的第一部分
#region _$field$ backing field
#region Documentation
/// <summary>_$field$ is a backing variable to $property$ property.
/// (Describe better)</summary>
/// <example>
/// <code lang="CS" title="." description=".">
/// $type$ $field$ = this._$field$;
/// </code>
/// </example>
/// <remarks>This field is marked with DebuggerBrowsableState.Never attribute.</remarks>
/// <requirements>.</requirements>
/// <seealso cref="$property$" cat="Fronting Property">$property$</seealso>
#endregion Documentation
[DebuggerBrowsable(DebuggerBrowsableState.Never)]
private $type$ _$field$ = $defaultValue$;
#endregion _$field$ backing field
#region $property$ Fronting property
#region Documentation
/// <summary>$property$ of type $type$ (Describe better).</summary>
/// <value>Returns $type$.</value>
/// <exception cref="" caption=""></exception>
/// <example>
/// <para>$type$ _$property$ = this.$property$;</para>
/// </example>
/// <remarks>This property is marked with XmlIgnore and
/// DebuggerStepThrough attributes.</remarks>
/// <requirements>.</requirements>
/// <seealso cref="_$field$" cat="Backing Field">_$field$.</seealso>
#endregion Documentation
[XmlIgnore]
public $type$ $property$
{
[DebuggerStepThrough] get { return this._$field$;}
[DebuggerStepThrough] set { this._$field$ = value;}
}
#endregion $property$ Fronting property
$end$
此代码块生成一个名为:_$field$
的类型为$type$
的支持变量,其初始默认值为$defaultValue$
,以及一个名为:$property$
的相同类型的属性。这些替换变量将被更改为所需的值,例如
$field$
..............=workedDays
$type$
................=int
$defaultValue$
..=0
$property$
.......=WorkedDays
它将产生这个
#region _workedDays backing field
#region Documentation
/// <summary>_workedDays is a backing variable to WorkedDays property.
/// (Describe better)</summary>
/// <example>
/// <code lang="CS" title="." description=".">
/// int workedDays = this._workedDays;
/// </code>
/// </example>
/// <remarks>This field is marked with DebuggerBrowsableState.Never attribute.
/// </remarks>
/// <requirements>.</requirements>
/// <seealso cref="WorkedDays" cat="Fronting Property">WorkedDays</seealso>
#endregion Documentation
[DebuggerBrowsable(DebuggerBrowsableState.Never)] private int _workedDays = 0;
#endregion _workedDays backing field
#region WorkedDays Fronting property
#region Documentation
/// <summary>WorkedDays of type int (Describe better).</summary>
/// <value>Returns int.</value>
/// <exception cref="" caption=""></exception>
/// <example>
/// <para>int _WorkedDays = this.WorkedDays;</para>
/// </example>
/// <remarks>This property is marked with XmlIgnore and
/// DebuggerStepThrough attributes.</remarks>
/// <requirements>.</requirements>
/// <seealso cref="_workedDays" cat="Backing Field">_workedDays.</seealso>
#endregion Documentation
[XmlIgnore]
public int WorkedDays
{
[DebuggerStepThrough] get { return this._workedDays; }
[DebuggerStepThrough] set { this._workedDays = value; }
}
#endregion WorkedDays Fronting property
关注点
除了生成的代码之外,带有支持字段和属性之间引用的文档(参见XML标签<seealso>
!)和生成的#regions
是这里的重点。
文档几乎已准备就绪,只需在summary
标签上稍作努力即可完成。任何使用此代码的人都能够看到IntelliSense显示summary标签的内容。而且#regions
将能够将代码块展开/折叠到所需的级别。