美文网首页unitycsharp
漫谈 Visual Studio 中最熟悉的“陌生人” - C

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

作者: 雨落随风 | 来源:发表于2020-08-26 00:24 被阅读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新版本。


    相关文章

      网友评论

        本文标题:漫谈 Visual Studio 中最熟悉的“陌生人” - C

        本文链接:https://www.haomeiwen.com/subject/yqkkrktx.html