unitycsharp

漫谈 Visual Studio 中最熟悉的“陌生人” - C

2020-08-26  本文已影响0人  雨落随风

Code Snippets - 代码段 ,vs2005 引入的功能。作为程序员,也许你每天都在用,然而可能你并不知道这个功能就叫这个东西。今天,笔者就跟大家简单的聊一聊它,说说你们或熟悉或将要熟悉的那个它。

1. 熟悉的陌生人

情景一:

我想把一堆代码分割成一块一块的,方便整理整顿代码,就像这样:


也许你会很快给出答案:“ 谁不会呀,就是快捷键 Ctrl+k、Ctrl+s 然后选中 #region 呗!”

但也许你并不知道,这么好用的功能,他就是 Code Snippets ,本文主角!
你写一些宏逻辑时用到的 #if 。同样是本文主角,就不多哔哔赖赖了。

情景二:

经常感慨大佬指点的神奇小技巧,几个字符就把程序写好了的那种:

  1. 写下 ctor 按2下 Tab 就能自动生成构造函数
  2. 写下 prop 按2下Tab就能自动生成属性
  3. ...

当然还有自己“潜移默化”就被IDE教会了的小技巧:

  1. 写 for 循环时,写完 for 一对 Tab 一敲便完成了for语法。
  2. 写 foreach 时,一对Tab,巴拉巴拉 ... ...
  3. 写出 try 时,一对Tab,巴拉巴拉 ... ...
  4. 写出 do 时,一对Tab,巴拉巴拉... ...
  5. 写出 switch 时,一对 Tab,就出现了 Switch case 的语法结构,更神奇的是当你往switch的括号里面输入一个枚举参数时,敲一个回车或一个 ↓ 下键 过去,哇喔,case 都帮你写好了喂。

其实呢,这些都是 Code Snippets 带来的便捷。
而且 Ctrl+K、Ctrl+S 还有个兄弟 : Ctrl + K 、Ctrl+X ,前者唤起 IDE 自带 Snippets 而后者则唤起用户自定义 Snippets ,看动图演示:


从以往的经验来看,我们大都是直接在代码上下文 key 几个关键字得到咱们想要的 snippet,就比如咱们写 for 语法时。
而且还可以在智能感知菜单中使用 Snippets 过滤条件,只显示 Snippets,演示如下:
笔者使用 Ctrl+J 唤起智能感知菜单,使用菜单右下角按钮筛选出所有 Snippets
所以 Ctrl + K 、Ctrl+X 没用过,也无需唏嘘,觉着IDE也没鼓励咱这么用~

2. 新的征途

现在,是不是能理解笔者为啥说这个功能是一个熟悉的“陌生人”了?
好的,接下来笔者给出2个典型,看看 code snippets 是如何方便了我们的开发。

示例一:

背景:
.Net4.x 新增的语法中,$ 符号 代替 string.Format 带来的便利令人耳目一新,省去了容易出错的 {0}、{1} ...占位符,同时也简化了相关API的调用。
在以前可能还会用上形如 UnityEngine.Debug.LogFormat() 的API: (笔者是Unity程序员)


而如今的他们,竟一不小心全部作古,有了 $ log 输出就变成下面这样子咯,变量想怎么在log中穿插就怎么穿插,爽的飞起!。

而且,还可以把上下文的变量拿来做逻辑运算,只需要用小括号括起来即可。

痛点:
虽然有了 $ 加持, 调试时输出 log 更顺手了,可是,每次想要输出一个log来,不管你输出的内容复杂与否,你都不可避免的写完下面这些东西:

Debug.Log($"{you field} ")

不难发现此时手指要敲一堆星罗棋布的标点符号:$()"";{} ,外加一个 Shift!
可我要的只是一个 log 啊,这他喵的才几个字符,却让我的手指爬满了整个键盘,上上下下左左右右,这个痛点必须被解决。
于是他来了~

实现:

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
      <Title>Debug.Log($"")(完全限定)</Title>
      <Author>Bian Shanghai</Author>
      <Description>UnityEngine.Debug.Log 的代码片段</Description>
      <HelpUrl>
      </HelpUrl>
      <Shortcut>log</Shortcut>
    </Header>
    <Snippet>
      <Declarations>
        <Literal Editable="false">
          <ID>UnityLog</ID>
          <ToolTip>
          </ToolTip>
          <Default>
          </Default>
          <Function>SimpleTypeName(global::UnityEngine.Debug)</Function>
        </Literal>
      </Declarations>
      <Code Language="csharp" Delimiter="$"><![CDATA[$UnityLog$.Log($$"{GetType()}: $end$");]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>
VS下使用快捷键: Ctrl+K 、Ctrl+B 唤起

上面 xml 代码段保存图示路径所在文件夹,改后缀为 .snippet ,回到 vs 中就可以看效果咯:

有了这个 Snippets ,Debug时只需要无脑的敲出 log 即可 ,舒坦! 。
现在,我们只需聚焦到程序调试本身,而无需费神耗时爬满键盘打那些可恶的字符了,节省的这几秒长远来看省的不仅仅是大把时间,更是提高了解决问题时的专注度呢。

示例二:

背景:
现在写代码多关注版权或者说协同作业的责任分担,也为了表现的更专业,往往类型的上方都会写上注释,标明创建人、创建时间、类型的作用(等等):

实现:
可以使用修改脚本模板的方式(本文不做赘述)。
更可以使用本文主角 snippet 实现:

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
      <Keywords />
      <Title>doc the class </Title>
      <Author>BianShanghai</Author>
      <Description>用于对 类型 署名的代码片段</Description>
      <HelpUrl>
      </HelpUrl>
      <Shortcut>docc</Shortcut>
    </Header>
    <Snippet>
      <References />
      <Imports />
      <Declarations>
        <Literal Editable="true">
          <ID>Description</ID>
          <ToolTip>类型描述</ToolTip>
          <Default>描述构建此类型的意图</Default>
          <Function>
          </Function>
        </Literal>
        <Literal Editable="true">
          <ID>Author</ID>
          <ToolTip>作者</ToolTip>
          <Default>BianShanghai</Default>
          <Function>
          </Function>
        </Literal>
        <Literal Editable="true">
          <ID>Date</ID>
          <ToolTip>中文输入法快捷键: SJ可输入今天日期</ToolTip>
          <Default>录入当前日期</Default>
          <Function>
          </Function>
        </Literal>
      </Declarations>
      <Code Language="csharp" Kind="type decl" Delimiter="$"><![CDATA[/* 
*Author: $Author$
*Date: $Date$
*Porpurs:$Description$
*/]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

使用方法跟第一个示例一样,下面看下效果就行:



可以看到

  1. 只需要输入 docc (doc + class 的简称)就能很快的出来这个类的描述模板。
  2. 每一个需要用户输入的地方都可以设置 tips 做友情提示
  3. 可以使用 Tab 键在这几个需要自定义内容的地方导航。

3. 结语:

通过本文,童靴们现在应该对这个 snippet 有了更深刻的了解了,虽然本文只是泛泛而谈,没有教程那种过于精细的细节指导,但是笔者认为篇幅限制之下,科普的目的应该已是达到了罢~
觉得示例可能对你有帮助,鼓励动手试试,想要进一步了解一下的,可以看看扩展阅读。

4. 扩展阅读:

5. 番外:

我用的VS 2019 居然对格式说明符有了Tips,好像更方便了耶!鼓励尝试VS新版本。


上一篇 下一篇

猜你喜欢

热点阅读