善用VS中的Code Snippet来提高开发效率

2023-05-16

前言

在谈谈VS中的模板中,我介绍了如何创建项目/项模板,这种方式可以在创建项目时省却不少重复性的工作,从而提高开发效率。在创建好了项目和文件后,就得开始具体的编码了,这时又有了新的重复性工作,就是需要经常编写一些类似或者说雷同的代码,我们需要一种方法将这些代码管理起来,减少重复输入。

一个常见的例子,在使用for语句结构时,可能会有这样的代码:

ContractedBlock.gif ExpandedBlockStart.gif Code
int[] array = { 12345 };
for (int i = 0; i < array.Length; i++)
{
    Console.WriteLine(array[i]);
}


或者

ContractedBlock.gif ExpandedBlockStart.gif Code
List<string> names = new List<string> { "Anders""Bill""Clark""David"};
for (int i = 0; i < names.Count; i++)
{
    
if (names[i].StartsWith("A"))
    {
        Console.WriteLine(names[i]);
    }
}


显然,这两个for循环的代码很相似:输入for,选择一个变量用作索引,该变量有个上限值,还有几个括号和分号。而且绝大多数的for循环都是如此,那么该如何减少重复输入呢? 可以想到的一种方法是把一段for循环的代码保存在某个地方,比如一个文件内,在需要for的地方,拷贝进来,把变量名、初始值、上限修改一下就可以用了。

VS的开发者想的很周全,提供了Code Snippet功能,从而实现了上面的想法。它保存了for循环代码的模板,然后给它一个快捷键for。现在在编辑器中(需要是C#文件),输入for,连续按两下Tab键,就会出现下面的代码:
2009021617564913.jpg

不仅有了for的基本代码,还定位到了变量的名字处,如果需要可以修改变量名,假设改为index,后面的两个i会自动改为index,然后按Tab,光标会跳至下一个深色显示的地方,即length,这里可以修改index的上限,然后回车,光标会跳至for循环的代码体:
2009021617570312.jpg

是不是很方便呢?还有很多其它Snippet,比如输入cw,按两下Tab就出来Console.WriteLine()。

很多时候,同样的功能在不同语言内的表现是不同的,所以Code Snippet(以下简称Snippet)是特定于语言的,也就是说C#的Snippet不能用于VB.NET。VS2008中的Snippet支持C#、VB.NET、XML。

Snippet的管理

首先VS2008提供了很多内置的Snippet,另外我们也可以将自己编写的或者他人编写的导入VS中。通过菜单Tools -> Code Snippets Manager(或按Ctrl+K, Ctrl+B),打开Code Snippets Manager窗口:
2009021617573712.jpg

可以看到上面的Language列表,现在选中的是C#。可以通过Import方式来导入新的Snippet。在使用NUnit时,由于测试代码的特点,会有很多重复输入,所以Scott Bellware提供了NUnit的Snippet,我把它放在自己的博客来了:BellwareNUnitSnippet。现在把包里的.snippet文件导入。
2009021617591277.jpg

嗯,可以使用了。比如,输入tc,按两下Tab,出来的代码是这样的:
2009021617593769.jpg

输入TestCase的名称,回车,这样就可以输入测试代码了。观察一下这个Snippet,它的变化之处只有一个,就是TestCase处。

接下来我们来分析一下Snippet文件的结构,这样才能编写自己的Snippet。

Snippet定义文件解析

下面来看看Snippet是如何实现的。根据上面tc的例子,我们可以猜想要存放Snippet,至少需要模板代码、占位符、语言类型、快捷键这几个关键信息,每个Snippet都是如此。事实上,VS把这些信息保存在XML文件中,这些信息都对应着某些节点,这个与上一篇里的模板清单文件类似。

存放Snippet的文件是XML文件,不过它的扩展名是.snippet。一个Snippet文件可以包含多个Snippet,就像上面的BellwareNUnit.snippet那样。它的基本结构如下:

ContractedBlock.gif ExpandedBlockStart.gif XML Code
<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    
<CodeSnippet Format="1.0.0">
        
<Header>
            
<Title>Code Snippet for Debug.WriteLine method.</Title>
            
<Shortcut>dw</Shortcut>
            
<Author>Anders Cui</Author>
        
</Header>
        
<Snippet>
            
<Code Language="CSharp">
                
<![CDATA[
                Debug.WriteLine(“Text”);
                
]]>
            
</Code>
        
</Snippet>
    
</CodeSnippet>
    
<!-- dot.gifother snippetsdot.gif -->
</CodeSnippets>


现在新建一个XML文件,输入上面的代码,这里我们的Snippet是输入Debug.WriteLine代码。该文件的根节点为CodeSnippets,可以包含多个<CodeSnippet>节点。注意它的命名空间,有了这个,在VS内编辑时就方便多了。

重点关注<CodeSnippet>节点,它即表示一条Snippet。它必须包含一个Format Attribute(老是看到Attribute和Property的讨论,故在此保留),用以表示Snippet版本。另外它必须包含两个子节点:<Header><Snippet>

对于<Header>节点,最重要的是Title和Shortcut,即Snippet的名称和快捷键;另外还有SnippetTypes,它可以包含若干个SnippetType节点,可有三种取值,Expansion、SurroundsWith、Refactoring。Expansion允许代码插入在光标处;SurroundsWith允许代码围绕在选中代码两边(就像#region那样);Refactoring指定了在C#重构过程中所使用的Snippet,在自定义Snippet中不能使用。如果该值不做设置,则Snippet可以放在任何地方。

要了解<Header>的更多信息,请参看这里。

对于<Snippet>节点,它是实现代码模板的地方。它包含四个子节点。

1、 <Code>节点

  • Delimiter:分隔符,默认值为$,后面你会看到它的用法。
  • Kind:Snippet的类型,比如方法体、方法声明、类型声明等。
  • Language:所适用的语言类型,如C#、VB.NET、XML。

在我们上面的例子中,已经有了Code节点了,注意这里把代码包含在<![CDATA[]]>中,因为代码很可能会包含一些特殊字符。

在上面的tc Snippet中,按下Tab后,VS会选中TestCase,这样修改起来更为方便,对于上面的dw Snippet,我们自然希望VS选中”Text”部分,这需要下面的<Declarations>节点。

2、<Declarations>节点

该节点包含若干个<Literal>和<Object>节点。它们可以看作是占位符。<Literal>用于指定一些文本值,<Object>则用于声明模板中的对象。
详细信息请参看<Literal>和<Object>。

这里需要把”Text”看作占位符,所以添加一个<Literal>节点:

ContractedBlock.gif ExpandedBlockStart.gif XML Code
    <Snippet>
        
<Code Language="CSharp">
            
<![CDATA[
            Debug.WriteLine($text$);$end$
            
]]>
        
</Code>
        
<Declarations>
            
<Literal>
                
<ID>text</ID>
                
<ToolTip>Text to write</ToolTip>
                
<Default>"Text"</Default>
            
</Literal>
        
</Declarations>
    
</Snippet>


这里添加了一个占位符$text$,默认值为”Text”,行末的$end$是一个特殊的占位符,它表示当你按下回车后光标的位置

3. <Imports>节点

用于指定使用Snippet时应当向文件内添加的命名空间引用,不过只支持VB.NET。

4. <References>节点

用于指定使用Snippet时应当向添加的程序集引用,同样只支持VB.NET:(

好了,现在可以测试一下我们的Snippet了,将文件保存为.snippet文件,然后导入。
2009021618061725.jpg

2009021618062591.jpg 
还不错吧?

Code Snippet 函数

前面说到,<Imports>和<References>节点只能用于VB.NET,而这里的Code Snippet函数则只能用于C#。

在<Literal>和<Object>节点中,都包含了子节点<Function>,这些函数是VS的一部分,有时会比较有用。共有三个函数:

1. GenerateSwitchCases(EnumerationLiteral),根据提供的枚举类型生成一个switch语句和一系列case语句,事实上,C#中已有这样的一个例子:
2009021618071064.jpg

回车确认:
2009021618072125.jpg

2. ClassName(),返回Snippet所在类的名称。

3. SimpleTypeName(TypeName),在Snippet所在的上下文中推断出TypeName参数的最简单形式。
下面以SimpleTypeName为例来看一下这些函数的用法:

ContractedBlock.gif ExpandedBlockStart.gif XML Code
<Snippet>
    
<Code Language="CSharp">
    
<![CDATA[
    $NameOfDebug$.WriteLine($text$);$end$
    
]]>
    
</Code>
    
<Declarations>
        
<Literal>
            
<ID>text</ID>
            
<ToolTip>Text to write</ToolTip>
            
<Default>"Text"</Default>
        
</Literal>
        
<Literal Editable="false">
            
<ID>NameOfDebug</ID>
            
<Function>SimpleTypeName(global::System.Diagnostics.Debug)</Function>
        
</Literal>
    
</Declarations>
</Snippet>


这里比前面的Snippet添加了一个Literal,为什么需要这么做呢?我们知道System.Diagnostics命名空间默认情况下是没有引用的,如果使用Debug类,还需要引用System.Diagnostics。这里的妙处在于VS会推断NameOfDebug的最简单形式,如果没有引用System.Diagnostics,它会在Debug前面加上,否则就不会加上。

几条建议

首先,Snippet的定义都在XML中,因此也算得上是代码,所以在命名上与其它代码无异,都要选择更有意义或者相关性的名字。命名快捷键的一个做法是使用首字母的缩写,比如Assert.AreEqual(expected, actual);的快捷键为ae。

另外,记得填写ToolTip节点的内容,这些内容在使用Snippet时会看到。

其它工具


虽然Snippet可以简化代码输入,可是它本身的编写却并非很方便,使用一些可视化工具会更好,比如Snippet Editor,有兴趣可以试一下。

另外,这个世界还有很多人在编写Snippet,比如gotcodesnippets.com,所以在动手编写之前可以先搜索一下:)

小结

本文介绍了Code Snippet的使用和编写,它可以看作是代码片段的模板,在粒度上比项目/项模板更小,从而进一步提高了工作效率。

参考

《Professional Visual Studio® 2008 Extensibility》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

善用VS中的Code Snippet来提高开发效率 的相关文章

  • VS Code的Git插件

    Visual Studio Code是微软公司推出的一款跨平台代码编辑 Edit 编译 Build 调试 Debug 工具 笔者认为其相当于是Sublime Text这款代码编辑器的升级版 集成了丰富的插件 xff0c 包括代码管理中极为常
  • ReviewBoard+SVN配置强制code review

    本文需要在svn与reviewboard安装成功之后开始进行配置 xff0c 详情参考如下两篇文章根据实际情况操作 xff1a Ubuntu安装Apache 43 Svn 43 Submin https blog csdn net qq 2
  • VS Code保存后自动格式化Vue代码---Vetur

    在VS Code里面编辑Vue代码 xff0c 通常我们会安装插件Vetur xff0c 本次介绍的格式化代码也依赖于Vetur插件 具体见一下步骤 注 xff1a VS Code版本为1 74 3 1 安装插件Vetur 2 配置自动格式
  • opencv模板匹配步骤及Code

    opencv模板匹配步骤及Code 首先介绍一下模板匹配的适用场景 xff1a 1 图像检索 2 目标跟踪 简单的说 xff0c 模板匹配最主要的功能就是在一幅图像中去寻找和另一幅模板图像中相似度最高的部分 xff0c 这就是模板匹配 比如
  • Qt播放视频报错 DirectShowPlayerService::doRender: Unresolved error code 0x80040266

    没有插件报错 xff1a DirectShowPlayerService doRender Unresolved error code 0x80040266 如果文件路径不对或者文件名是中文的 xff0c 则会显示如下错误 xff1a Di
  • 再写ubuntu 下 VS code的C++配置——gcc和clang

    喵哥在去年写了一篇关于VScode配置的文章 xff0c Ubuntu vscode的C 43 43 tasks json xff0c 当时只是记录了如何配置 xff0c 但是没有说为什么这么配置 xff0c 而且只有gcc的配置 xff0
  • Jmeter_Non HTTP response code: java.net.SocketException

    error msg rc 61 span class hljs string 34 Non HTTP response code java net SocketException 34 span rm 61 span class hljs
  • VS Code Remote SSH远程连接异常:Resolver error: Error: Running the contributed command

    VS Code Remote SSH远程连接异常 问题描述原因分析解决方案扩展Remote SSH首次连接插件做了什么Remote SSH对于远程Linux的要求 问题描述 通过VS Code插件Remote SSH连接一台新主机时 xff
  • vs code中项目的基本配置--include路径、运行参数、debug配置

    1 安装C C 43 43 for Visual Studio Code 点击左边扩展栏图标 gt 搜索C C 43 43 gt 安装 gt Reload xff1a 安装完成之后 xff0c 打开你的包含c 43 43 的文件夹 xff0
  • 有效解决“SyntaxError: Non-UTF-8 code starting with” 语法错误

    在程序中出现中文的时候会有这种报错 xff0c 在代码的第一行加一句注释 xff0c 说明一下字符类型可以解决 coding 61 gbk coding utf 8这两种在我的程序里是亲测有效的
  • Visual Studio Code (vscode) 配置 C / C++ 环境

    Visual Studio Code vscode 配置 C C 43 43 环境 步平凡 博客园 在电脑安装软件管控严格的情况下 xff0c 想装VS装不了 xff0c 就装轻量版的VSCode了 以上写得很好 xff0c 照做即可 本人
  • VS Code创建、调试ROS项目

    前言 xff1a 在vs code下配置ROS项目开发的环境 包括catkin创建编译工作空间 xff0c 创建ROS项目 xff0c 调试ROS节点 一 创建工作空间 首先创建一个cMake工作空间 xff0c 用到了catkin mak
  • visual studio code中模拟浏览器端向服务端发起请求

    一 需要使用的插件 二 使用方式 1 创建 http文件 2 在所创建的 http文件中输入如下内容 相关具体的使用方式可参见 xff1a https marketplace visualstudio com items itemName
  • 报错{“msg“:“invalid token“,“code“:401}问题的解决

    报错 msg invalid token code 401 问题的解决 xff1a 解决办法 xff1a 将精确的路由放在最上面 xff0c 模糊的路由放在最下面 xff0c 防止精确的路由被覆盖
  • VS Code For Web 深入浅出 -- 进程间通信篇

    在上一篇中 xff0c 我们一起分析了 VS Code 整体的代码架构 xff0c 了解了 VS Code 是由前后端分离的方式开发的 且无论前端是基于 electron 还是 web xff0c 后端是本地还是云端 xff0c 其调用方式
  • npm错误——npm ERR! code ERESOLVE 解决方法

    npm ERR code ERESOLVE npm ERR ERESOLVE unable to resolve dependency tree npm ERR npm ERR While resolving vol vue3 64 0 1
  • Transformer代码讲解(最最最最......详细)

    Transformer代码讲解 最最最最 详细 整个代码主要分为两部分去讲解 一 完整代码 二 部分代码剖析 1 主函数if name main 2 从整体网路结构来看 分为三个部分 编码层 解码层 输出层 3 Encoder 部分包含三个
  • Golang实现一个事务型内存数据库

    内存数据库经我们经常用到 例如Redis 那么如何从零实现一个内存数据库呢 本文旨在介绍如何使用Golang编写一个KV内存数据库MossDB 特性 MossDB是一个纯Golang编写 可嵌入的 键值型内存数据库 包含以下特性 可持久化
  • 基于多项贝叶斯的三分类的情感分析实现

    写在前面 本实验报告是一篇很水的水课的期末大作业 代码 数据集均为原创 意在用最少的代码和最简单的数据集完成老师留下的题目 仅供交流学习使用 禁止直接洗稿嗷 目录 写在前面 一 实验目的 二 实验手段和方法 三 实验内容 四 实验总结 一
  • 排序算法总结(Python版本)

    看了很多排序算法 每种算法都有多个版本 现总结一版自己觉得容易理解的 供以后翻阅 1 插入排序 直接插入排序 直接插入排序是将一个数插入到已经排序好的序列中 做法是先将第一个数作为已经排序好的 依此将后面的数取出插入到前面已排序好的序列中

随机推荐

  • 想要恢复回收站误删文件,就用EasyRecovery!

    不知道大家在日常工作中遇到回收站误删文件的情况吗 xff1f 遇到这样的情况 xff0c 不要慌张 xff0c 可以借助专业的数据恢复软件来处理 EasyRecovery软件是由全球著名数据厂商Kroll Ontrack出品的数据恢复软件
  • ubuntu 设置root用户密码并实现root用户登录

    一 xff1a 设置root用户密码 在ubuntu中root用户的密码是随机的 xff0c 所以需要我们自己起设置root用户的密码 在终端命令行中执行 sudo passwd 这时候会提示你输入当前用户密码 xff0c 输入成功之后 x
  • electron制作聊天界面(仿制qq)

    效果图 样式使用scss和flex布局 这也是制作IM系统的最后一个界面了 在制作之前参考了qq和千牛 需要注意的点 qq将滚动条美化了 而且在无操作的情况下是不会显示的 滚动条美化 webkit scrollbar 滚动条整体样式 wid
  • element-ui中的el-table滚动加载事件

    问题描述 xff1a 当表格数据量过多 xff0c 一次请求回来会很卡 xff0c 同时又不想分页的情况下 xff0c 我们想让鼠标滚动到表格底部时再去请求数据 解决思路 xff1a 项目用的是element ui的框架 xff0c 给el
  • OpenWRT配置IPV6

    准备材料 智博通 WG3526 路由器 MT7621A 16M ROM 512M RAM 中国移动光纤入户 Prefix Delegation前缀委托模式 刷机 OpenWRT 18 06 for ZBT WG3526 配置 etc con
  • chrome浏览器去掉打开新标签的常用地址缩略图

    chrome浏览器是我们最常用的浏览器 xff0c 但是打开标签后会显示历史的缩略图 有时别人借用我们的电脑 xff0c 或者开着电脑演示时 xff0c 这些浏览记录就会被展示出来 xff0c 总是感觉怪怪的 谷歌一番 xff0c 发现了关
  • cisco交换机如何查看CPU和内存使用情况,以及如何查看接口数据量

    switch4006 show processes cpu CPU utilization for five seconds 4 0 one minute 4 five minutes 4 PID Runtime ms Invoked uS
  • Remix OS PC硬盘版的安装方法。

    前言 大家好 xff0c 今天由我 xff0c 功能讨论区版主来给大家介绍一下Remix OS PC硬盘版的安装方法 开始之前大家需要明确几点 xff1a 0 你的电脑需要满足如下要求 xff08 仔细看清楚这个列表 xff0c 缺一不可
  • inline-block在360浏览器中的显示问题

    360浏览器不支持inline block效果 xff0c 在样式表中加入 display inline block zoom 1 display inline 就能达到display inline block的效果了 转载于 https
  • 个人团队贡献分+转会人员

    经过我们的商议 xff0c 个人团队贡献分如下分配 xff1a 黄杨 xff1a 33 王安然 xff1a 32 韩佳胤 xff1a 31 刘俊伟 xff1a 28 林璐 xff1a 29 谢伯炎 xff1a 30 谭传奇 xff1a 27
  • 如何在bash shell命令行中非常有效地搜索历史命令?

    How to search history commands very effectively in bash shell command line 如何在bash shell 命令行中非常有效地搜索历史命令 xff1f Just ente
  • GreenPlum 锁表以及解除锁定

    最近遇到truncate表 xff0c 无法清理的情况 xff0c 在master节点查看加锁情况 xff0c 并未加锁 这种情况极有可能是segment节点相关表加了锁 xff0c 所以遇到这种情况除了排查master节点的锁 xff0c
  • 使用 FreeRTOS 时注意事项总结(基础篇教程完结)

    以下转载自安富莱电子 xff1a http forum armfly com forum php FreeRTOS 的初始化流程 推荐的初始化流程如下 xff0c 本教程配套的所有例子都是采用的这种形式 xff0c 当然 xff0c 不限制
  • 使用Python实现Hadoop MapReduce程序

    为什么80 的码农都做不了架构师 xff1f gt gt gt 笔者的机器运行效果如下 xff08 输入数据是find的帮助手册 xff0c 和笔者预期一样 xff0c the是最多的 xff09 xff1a 以下是原帖 在这个实例中 xf
  • 解决vnc连接Linux出现X形

    编辑vnc配置文件 vnc xstartup如下 xff1a bin sh Uncomment the following two lines for normal desktop unset SESSION MANAGER exec et
  • 交换机 BootROM 下的升级配置

    实验十 交换机 BootROM 下的升级配置 一 实验目的 1 了解什么时候采用 BootROM 升级 xff1b 2 了解怎样使用 BootROM升级交换机 二 应用环境 当交换机的系统文件遭到破坏时 xff0c 已经无法进入正常的CLI
  • 如何利用 Visual Studio 自定义项目或工程模板

    在开发项目的时候 xff0c 由其是商业性质的大型项目时 xff0c 往往需要在每个代码文件上都加上一段关于版权 开发人员的信息 xff0c 并且名称空间上都需要带有公司的标志 这个时候 xff0c 是选择在开发的时候手动添加还是自动生成呢
  • vncserver和Ubuntu Xfce4远程桌面环境的配置,解决不显示图形界面

    vncserver和Ubuntu Xfce4远程桌面环境的配置 参考的http blog 163 com thinki cao blog static 83944875201303014531803 ubuntu用vnc连接后不显示图形界面
  • Windows平台下利用Fastcopy来做数据的定期同步

    FastCopy号称是Windows 平台上最快的文件拷贝 删除软件 xff0c 特别是文件超多 超大的情况下 为此我们在数据备份的时候选择FastCopy 但是 FastCopy如果直接来做计划任务的话会有一个问题 xff0c 因为打开的
  • 善用VS中的Code Snippet来提高开发效率

    前言 在谈谈VS中的模板中 xff0c 我介绍了如何创建项目 项模板 xff0c 这种方式可以在创建项目时省却不少重复性的工作 xff0c 从而提高开发效率 在创建好了项目和文件后 xff0c 就得开始具体的编码了 xff0c 这时又有了新