代码片段:从创建到安装的逐步指南






4.91/5 (41投票s)
本文旨在鼓励您利用代码片段,使开发更轻松、更快速。
目录
- 引言:什么是代码片段??
- 我们可以创建自己的代码片段吗??
- 创建 .snippet 文件(分步指南)
- 如何在 VS 编辑器中管理代码片段??
- 添加/注册一个代码片段
- 删除一个代码片段
- 修改现有代码片段
- 代码片段函数
- GenerateSwitchCases( EnumerationLiteral )
- ClassName()
- SimpleTypeName( TypeName )
- 是否可以与我的所有团队成员共享??
- 创建 vsi 安装程序(分步指南)
- 示例
- 单例模式示例:1
- 单例模式示例:2
A. 引言:什么是代码片段??
代码片段是预制的代码片段,我们可以快速将其插入到我们的代码中。
我们可以使用代码片段输入一个简短的别名,然后将其展开为常用的编程结构。
例如,**prop** 代码片段会创建一个空的 **属性** 块。
优点
- 一次编写,随处使用:减少重复编写代码的工作量。
- 定义/维护适用于任何项目/组织的 **编码标准**。
- 提供一种更简单的方法来编写/定义一组代码。例如,代码片段仅通过其快捷方式(如 **myswitch**)即可生成 Switch case 语句。
- **易于使用**、创建和维护。
- **与** 其他开发人员**共享** 管理
如何使用
**步骤 1。** 在代码编辑器中,通过键入别名或代码片段快捷方式的简短名称
**步骤 2。** 按两次 **Tab** 键。它将自动生成一个属性块
**步骤 3。** 选择代码片段后,代码片段的文本将自动插入到光标位置。此时,代码片段中的所有可编辑字段都将以浅绿色高亮显示,并自动选中第一个可编辑字段。
选中一个字段时,用户可以键入新值。按 **TAB** 键可在代码片段的可编辑字段之间循环;按 **SHIFT+TAB** 键可按相反的顺序循环。单击字段会将光标置于该字段中,双击字段则会选中该字段。
仅第一个字段实例是可编辑的;当该字段高亮显示时,该字段的其他实例将显示边框。更改可编辑字段的值时,该字段在代码片段中的所有出现处都会随之更改。
B. 我们可以创建自己的代码片段吗??
是的,我们可以创建和利用自定义代码片段,除了 Visual Studio 默认包含的代码片段外。
IntelliSense 代码片段是具有 .snippet 文件扩展名的 XML 文件,它们遵循 IntelliSense 代码片段 XML 架构。
创建 .snippet 文件
- 转到 **文件 - 新建 - 文件**。
- 在“模板”中选择 **XML 文件**,然后单击 **打开**,这将打开一个空白 XML 文件供编辑。
- 在“文件”菜单上,单击 **保存 <XMLFileName>**。
- 在“保存类型”框中,选择 **所有文件 (*.*)**。
- 在“文件名”框中,输入一个带有 **.snippet** 文件名扩展名的文件名。
- 点击 **保存**。
编写代码
现在我们有了一个 XML 文件,我们需要编写构成我们代码片段的 XML 代码。
- 在自动生成的 XML 行下方,添加一个具有正确
xmlns
属性值的CodeSnippets
元素,以及一个CodeSnippet
元素来创建一个单独的代码片段。例如:<?xml version="1.0" encoding="utf-8" ?> <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> <CodeSnippet Format="1.0.0"> </CodeSnippet> </CodeSnippets>
注意:这是 VS 定义的标准,每个片段文件都必须以
CodeSnippets
标签开头,该标签标识定义代码片段架构的命名空间。在这些标签内,每个片段使用CodeSnippet
标签定义,该标签又包含片段本身的定义。 - 为代码片段添加标题部分。每个代码片段都有一个标题区域和一个主体区域,分别称为
Header
和Snippet
。Header
区域主要包含三个标签:Title
:片段的名称Description
:片段的描述Shortcut
:快捷方式名称提供了一种方法,让我们通过键入快捷方式名称然后按 Tab 来将 IntelliSense 代码片段插入到我们的代码中。
除了这些标签,我们还可以使用 **Author**、**SnippetTypes** 标签,例如:
<?xml version="1.0" encoding="utf-8" ?> <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> <CodeSnippet Format="1.0.0"> <Header> <Title>Property</Title> <Shortcut>propcs</Shortcut> <Description>Code snippet to define a property .</Description> <Author>Anand Ranjan</Author> <SnippetTypes> <SnippetType>Expansion</SnippetType> </SnippetTypes> </Header> </CodeSnippet> </CodeSnippets>
一目了然:代码片段管理器快照 – 标题标签元素的使用
一目了然:VS 编辑器快照 – 标题标签元素的使用
- 添加定义代码片段本身的元素。例如:
<?xml version="1.0" encoding="utf-8" ?> <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> <CodeSnippet Format="1.0.0"> <Header> <Title>Property</Title> <Shortcut>propcs</Shortcut> <Description>Code snippet to define a property .</Description> <Author>Anand Ranjan</Author> <SnippetTypes> <SnippetType>Expansion</SnippetType> </SnippetTypes> </Header> <Snippet> <Code Language="csharp"> </Code> </Snippet> </CodeSnippet> </CodeSnippets>
- 在 Snippet 标签的 **Code** 元素内部,添加 C# 代码作为片段。所有片段代码都必须放在
<![CDATA[
和]]>
括号之间。例如:<?xml version="1.0" encoding="utf-8" ?> <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> <CodeSnippet Format="1.0.0"> <Header> <Title>Property</Title> <Shortcut>propcs</Shortcut> <Description>Code snippet to define a property .</Description> <Author>Anand Ranjan</Author> <SnippetTypes> <SnippetType>Expansion</SnippetType> </SnippetTypes> </Header> <Snippet> <Code Language="csharp"> <![CDATA[ /// <summary> /// Property to set a $property$ /// </summary> private $type$ $defaultValue$; public $type$ $property$ { get { return $defaultValue$; } set { $defaultValue$ = value; } } $end$]]> </Code> </Snippet> </CodeSnippet> </CodeSnippets>
- 我们可能需要代码片段的某些部分由插入它们的人来替换。代码片段通过 **Literal** 和 **Object** 元素提供了此功能。
**Literal** 元素用于标识代码片段中包含的但插入代码后很可能被自定义的代码的替换项。例如,文字字符串、数值和一些变量名应声明为字面量。可选的
<Declarations>
部分用于定义片段中的可替换部分。可替换部分在<Code>
部分中用$name
表示,并且是显示为绿色并由使用片段的开发人员可配置的部分。
创建字面量替换
- 找到代码片段的
Snippet
元素。 - 将
Declarations
元素添加为Snippet
元素的子元素。Declarations
元素用于对替换声明进行分组。 - 将
Literal
元素添加为Declarations
元素的子元素。Literal
元素指定单个字面量。一个代码片段可以有多个字面量替换。 - 将
ID
元素添加为Literal
元素的子元素。此元素的文本值指定您将在Code
元素中引用该字面量的名称。 - 将
Default
元素添加为Literal
元素的子元素。Default
元素的文本值指定插入代码片段时字面量的默认值。 - 可选地,添加
Function
和/或ToolTip
元素。
<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>Property</Title>
<Shortcut>propcs</Shortcut>
<Description>Code snippet to define a property .</Description>
<Author>Anand Ranjan</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>type</ID>
<ToolTip>Property type</ToolTip>
<Default>int</Default>
</Literal>
<Literal>
<ID>property</ID>
<ToolTip>Property name</ToolTip>
<Default>Value</Default>
</Literal>
<Literal>
<ID>defaultValue</ID>
<ToolTip>The default value for this property.</ToolTip>
<Default>intValue</Default>
</Literal>
</Declarations>
<Code Language="csharp">
<![CDATA[
/// <summary>
/// Property to set a $property$
/// </summary>
private $type$ $defaultValue$;
public $type$ $property$
{
get
{
return $defaultValue$;
}
set
{
$defaultValue$ = value;
}
}
$end$]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
一目了然:VS 编辑器快照 – 使用片段生成的代码
创建对象替换
Object
元素用于标识代码片段所需但很可能在片段本身之外定义的项。例如,Windows Forms 控件、ASP.NET 控件、对象实例和类型实例应声明为对象。对象声明需要指定一个类型。
创建对象替换
- 找到代码片段的
Snippet
元素。 - 将
Declarations
元素添加为Snippet
元素的子元素。Declarations
元素用于对替换声明进行分组。 - 将
Object
元素添加为Declarations
元素的子元素。Object
元素指定单个对象。一个代码片段可以有多个对象替换。 - 将
ID
元素添加为Object
元素的子元素。此元素的文本值指定您将在Code
元素中引用该对象的名称。 - 将
Type
元素添加为Object
元素的子元素。Default
元素的文本值指定对象的类型。 - 将
Default
元素添加为Object
元素的子元素。Default
元素的文本值指定插入代码片段时对象的默认值。 - 可选地,添加
Function
和/或ToolTip
元素。
示例
<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>Property</Title>
<Shortcut>getcustomer</Shortcut>
<Description>Code snippet to interact with database .</Description>
<Author>Anand Ranjan</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<!-- Add additional Snippet information here -->
<Declarations>
<Literal>
<ID>SqlConnString</ID>
<ToolTip>Replace with a SQL connection string.</ToolTip>
<Default>"SQL connection string"</Default>
</Literal>
<Object>
<ID>SqlConnection</ID>
<Type>System.Data.SqlClient.SqlConnection</Type>
<ToolTip>Replace with a connection object in your application.</ToolTip>
<Default>dcConnection</Default>
</Object>
</Declarations>
<Code Language="CSharp">
<![CDATA[
daCustomers = new SqlClient.SqlDataAdapter();
selectCommand = new SqlClient.SqlCommand($SqlConnString$);
daCustomers.SelectCommand = selectCommand;
daCustomers.SelectCommand.Connection = $SqlConnection$;
]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
C. 如何在 VS 编辑器中管理代码片段
**代码片段管理器** 允许我们设置要在代码中插入的目录和单个代码片段。
访问代码片段管理器
- 在 **工具** 菜单上,单击 **代码片段管理器**,或者也可以使用
键 **Ctrl + KB**
这将打开一个代码片段管理器对话框,如下所示:
向代码片段管理器添加目录
- 在 **语言** 列表中,选择要添加目录的语言。
- 单击“添加”。这将打开 **代码片段目录** 窗口。
- 选择要添加到 **代码片段管理器** 的目录,然后单击 **确定**。该目录现在将用于搜索可用的代码片段。
从代码片段管理器中删除目录
- 选择要删除的目录。
- 单击 **删除**。
将代码片段导入代码片段管理器
- 在 **语言** 列表中,选择要添加代码片段的语言。
- 选择要将导入的代码片段放置到的现有文件夹。
- 单击 **导入**。这将打开 **代码片段目录** 窗口。
- 选择要添加到 **代码片段管理器** 的代码片段文件,然后单击 **确定**。现在代码片段即可在代码编辑器中插入。
选择代码片段的位置,然后单击“完成”。
修改现有片段
IntelliSense 代码片段是具有 .snippet 文件扩展名的 XML 文件,可以使用任何 XML 编辑器(包括 Visual Studio 2005)轻松修改。
修改现有的 IntelliSense 代码片段
D. 代码片段函数
Visual C# 代码片段有三个可用的函数:
- **GenerateSwitchCases(** EnumerationLiteral **)**
为 EnumerationLiteral 参数指定的枚举成员生成一个 switch 语句和一组 case 语句。EnumerationLiteral 参数必须是对枚举成员或枚举类型的引用。
例如
<?xml version="1.0" encoding="utf-8"?> <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> <CodeSnippet Format="1.0.0"> <Header> <Title>myswitch</Title> <Shortcut>myswitch</Shortcut> <Description>Code snippet for switch statement</Description> <Author>Microsoft Corporation</Author> <SnippetTypes> <SnippetType>Expansion</SnippetType> </SnippetTypes> </Header> <Snippet> <Declarations> <Literal> <ID>expression</ID> <ToolTip>Expression to switch on</ToolTip> <Default>switch_on</Default> </Literal> <Literal Editable="false"> <ID>cases</ID> <Function>GenerateSwitchCases($expression$)</Function> <Default>default:</Default> </Literal> </Declarations> <Code Language="csharp"> <![CDATA[ switch ($expression$) { $cases$ } ]]> </Code> </Snippet> </CodeSnippet> </CodeSnippets>
使用示例:
一目了然:VS 编辑器快照 – 选择片段
将 **swich_on**(高亮显示为绿色)替换为我们的 **enum**,然后按两次 Enter 键。
一目了然:VS 编辑器快照 – 使用片段的最终结果
- ClassName()
返回包含插入片段的类的名称。
例如,要为带输入参数的类编写构造函数:
<?xml version="1.0" encoding="utf-8"?> <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> <CodeSnippet Format="1.0.0"> <Header> <Title>Common constructor pattern</Title> <Shortcut>myconstructor</Shortcut> <Description>Code Snippet for a constructor</Description> <Author>Anand Ranjan Pandey</Author> <SnippetTypes> <SnippetType>Expansion</SnippetType> </SnippetTypes> </Header> <Snippet> <Declarations> <Literal> <ID>type</ID> <Default>int</Default> </Literal> <Literal> <ID>name</ID> <Default>field</Default> </Literal> <Literal Editable="false"> <ID>classname</ID> <ToolTip>Class name</ToolTip> <Function>ClassName()</Function> <Default>ClassNamePlaceholder</Default> </Literal> </Declarations> <Code Language="CSharp" Kind="CData"> <![CDATA[ public $classname$ ($type$ $name$) { this._$name$ = $name$; } private $type$ _$name$; ]]> </Code> </Snippet> </CodeSnippet> </CodeSnippets>
用法示例
一目了然:VS 编辑器快照 – 使用片段的最终结果
- **SimpleTypeName(** TypeName **)**
它将
TypeName
参数简化为其在调用片段的上下文中的最简单形式。例如:下面的示例展示了如何使用
SimpleTypeName
函数。当此片段插入到代码文件中时,$SystemConsole$
字面量将被替换为在调用片段的上下文中 Console 类型的最简单形式。<?xml version="1.0" encoding="utf-8"?> <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> <CodeSnippet Format="1.0.0"> <Header> <Title>Console_WriteLine</Title> <Shortcut>mycw</Shortcut> <Description>Code snippet for Console.WriteLine</Description> <Author>Anand Ranjan Pandey</Author> <SnippetTypes> <SnippetType>Expansion</SnippetType> </SnippetTypes> </Header> <Snippet> <Declarations> <Literal Editable="false"> <ID>SystemConsole</ID> <Function>SimpleTypeName(global::System.Console)</Function> </Literal> </Declarations> <Code Language="csharp"> <![CDATA[ $SystemConsole$.WriteLine(); ]]> </Code> </Snippet> </CodeSnippet> </CodeSnippets>
用法示例
一目了然:VS 编辑器快照 – 使用片段的最终结果
E. 是否可以与我的所有团队成员共享??
是的,要使代码片段出现在代码编辑器中,它必须位于用户的计算机上并通过 **代码片段管理器** 导入。为了简化此过程,我们可以将片段文件放在 **Visual Studio 安装程序 (.vsi)** 文件中,并使用 Visual Studio 内容安装程序将文件放置在正确的位置。然后,可以轻松地将 **.vsi 文件** 与社区中的其他开发人员共享。
.vsi 文件创建步骤
Visual Studio 内容安装程序 (.vsi) 文件用于在开发者社区中交换 Visual Studio 内容。.vsi 文件是一个重命名的 .zip 文件,其中包含以下组件:
- 描述内容的 XML .vscontent 文件。
- 内容文件。
步骤 1: 文件 - 新建 - 文件
步骤 2: 从模板中选择 **XML** 文件类型
步骤 3: 按照给定架构,在 <FileName> 标签内添加文件/文件。有关架构信息,请参阅 Visual Studio 内容安装程序架构参考
在我的情况下,.vscontent 文件包含了以上所有示例。
<?xml version="1.0" encoding="utf-8"?>
<VSContent xmlns="http://schemas.microsoft.com/developer/vscontent/2005">
<Content>
<FileName>getCustomer.snippet</FileName>
<FileName>myconstructor.snippet</FileName>
<FileName>mycw.snippet</FileName>
<FileName>myswitch.snippet</FileName>
<FileName>propcs.snippet</FileName>
<FileName>singletonts.snippet</FileName>
<FileName>singletontswl.snippet</FileName>
<DisplayName>Sample Code Snippet</DisplayName>
<Description>A code snippet created for this example</Description>
<FileContentType>My Code Snippet</FileContentType>
<ContentVersion>1.0</ContentVersion>
<Attributes>
<Attribute name="language" value="csharp"/>
</Attributes>
</Content>
</VSContent>
步骤 4: 将文件保存为 **.vscontent** 扩展名,例如 MyCodeSnippet.vscontent
步骤 5:将 .vscontent 文件保存在与社区组件相关的其他文件相同的目录中。
步骤 6:选择文件夹,右键单击,选择 **发送到**,然后单击 **压缩(zipped)文件夹**。选定的文件将被压缩成一个 .zip 文件。
步骤 7:重命名 **.zip** 文件的扩展名为 **.vsi**
步骤 8:转到 C:\...\我的文档\Visual Studio <版本>\Addins\
步骤 9:将早期创建的 .vsi 文件粘贴到此文件夹中。我正在使用 Visual Studio 2008。
步骤 10:现在,您新创建的代码片段已准备好在 Visual Studio 2008 编辑器中使用。
F. 一个示例
让我们以单例类为例,它几乎用于每个项目。在本例中,我将创建一个代码片段,该代码片段将使用单例类概念生成代码。
单例示例 1
在此代码片段中,实现是线程安全的。线程锁定共享对象,然后检查实例是否已在创建实例之前创建。这解决了内存屏障问题(因为锁定确保所有读取都发生在锁定获取之后,而解锁确保所有写入都发生在锁定释放之前),并确保只有一个线程创建实例(因为同一时间只有一个线程可以进入该代码部分 - 当第二个线程进入时,第一个线程已经创建了实例,因此表达式将评估为 false)。不幸的是,性能会受到影响,因为每次请求实例时都会获取锁。
**文件名:** singletontswl.snippet
代码
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>Thread safe Singleton Pattern with Lock</Title>
<Shortcut>singletontswl</Shortcut>
<Description>Code Snippet for a singleton class : Thread-safe with locks</Description>
<Author>Anand Ranjan Pandey</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>instancename</ID>
<Default>instance</Default>
</Literal>
<Literal>
<ID>instanceobject</ID>
<Default>Instance</Default>
</Literal>
<Literal>
<ID>lockobject</ID>
<Default>padlock</Default>
</Literal>
<Literal Editable="false">
<ID>classname</ID>
<ToolTip>Class name</ToolTip>
<Function>ClassName()</Function>
<Default>ClassNamePlaceholder</Default>
</Literal>
</Declarations>
<Code Language="CSharp" Kind="CData">
<![CDATA[
static $classname$ $instancename$ =null;
static readonly object $lockobject$ = new object();
$classname$()
{
}
public static $classname$ $instanceobject$
{
get
{
lock ($lockobject$)
{
if ($instancename$==null)
{
$instancename$ = new $classname$();
}
return $instancename$;
}
}
}
]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
现在我们使用 **代码片段管理器** 注册此片段,并在我们的单例类中使用它,如下所示:
按 Tab 键后,最终结果是:
单例示例 2
在此代码片段中,实现是线程安全的,无需使用锁。
**文件名:** singletonts.snippet
代码
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>Thread safe Singleton Pattern</Title>
<Shortcut>singletonts</Shortcut>
<Description>Code Snippet for a singleton class : Thread-safe without using locks</Description>
<Author>Anand Ranjan Pandey</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>instancename</ID>
<Default>instance</Default>
</Literal>
<Literal>
<ID>instanceobject</ID>
<Default>Instance</Default>
</Literal>
<Literal Editable="false">
<ID>classname</ID>
<ToolTip>Class name</ToolTip>
<Function>ClassName()</Function>
<Default>ClassNamePlaceholder</Default>
</Literal>
</Declarations>
<Code Language="CSharp" Kind="CData">
<![CDATA[
static readonly $classname$ $instancename$=new $classname$();
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static $classname$()
{
}
$classname$()
{
}
public static $classname$ $instanceobject$
{
get
{
return $instancename$;
}
}
]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
现在我们使用 **代码片段管理器** 注册此片段,并在我们的单例类中使用它,如下所示:
按 Tab 键后,最终结果是:
代码片段就讲到这里。希望您会喜欢!
如何使用代码
注意:要使用示例,请按照以下步骤操作:
- 将 MyCodeSnippets.zip 文件解压缩到您想要的任何目录。
- 打开代码片段管理器,并添加 **MyCodeSnippets** 文件夹。
- 现在代码片段已准备好使用。
注意:以上所有示例都包含在 MyCodeSnippets.zip 文件中。
参考
MSDN:http://msdn.microsoft.com/en-us/library/ms165392(VS.80).aspx
**欢迎提供评论/查询!!!**