Повышаем эффективность работы в Visual Studio. Создание Code Snippets для C# и HTML

Дата публикации: 20.02.2020. Категория: Visual Studio
Последнее обновление: 21.02.2020

В этом уроке мы разберемся как создавать code snippets под свои нужды, чтобы повысить эффективность своей работы.

Можно дать такое определение:

Code Snippet - это шаблон (заготовка) кода, который можно многократно использовать в нужном контексте в нужное время.

Другими словами, можно заключить в контейнер код, который приходится часто писать вручную, и потом нажимая комбинацию горячих клавиш, вставлять данный код по требованию. Тем самым экономится очень много времени.

Все сниппеты можно найти через специальный менеджер, который находится в меню по адресу Tools > Code Snippets Manager...:

Code Snippets Manager
Code Snippets Manager

Через этот менеджер можно посмотреть список всех стандартных сниппетов для разных языков программирования, которые представлены в Visual Studio и которые можно использовать. Также можно добавить свой собственный сниппет, используя кнопку Import...

Данный C#-сниппет позволяет добавить в код строчку Console.WriteLine();
Данный C#-сниппет позволяет добавить в код строчку Console.WriteLine();

Создаем свой Code Snippet

Процесс создания сниппета состоит из нескольких этапов. Во-первых, обратимся к официальной документации по адресу: Walkthrough: Create a code snippet. Там наиболее полная информация обо всех аспектах в данном вопросе.

Далее создаем новый файл (можно прямо из Visual Studio) формата XML со следующей заготовкой:

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title></Title>
        </Header>
        <Snippet>
            <Code Language="">
                <![CDATA[]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>

Это простейшая заготовка, с которой можно начинать работу и расширить ее под свои нужды. Давайте это и сделаем. Например, я хочу создать сниппет, который будет служить следующей цели:
В ASP.NET MVC приложении в классе-контроллере довольно часто возникает задача через внедрение зависимостей (Dependency Injection) добавить в конструктор какой-нибудь функционал, чтобы он был доступен в пределах всего контроллера. Ну, например, контекст базы данных. Что-то типа такого:

 

Выше на скриншоте серым выделен тот участок кода, который мы перенесем в сниппет и будем вызывать через горячую клавишу. Для этого изменим заранее созданный XML-шаблон на следующий:

DMSnippet.snippet
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>DataManager code snippet</Title>
      <Description>Этот сниппет добавляет заготовку конструктора класса контроллера</Description>
      <Author>s.alekseev</Author>
      <Shortcut>dms</Shortcut>
    </Header>
    <Snippet>
      <Imports>
        <Import>
          <Namespace>WebApplication1.SecretNamespace</Namespace>
        </Import>
      </Imports>
      <Declarations>
        <Literal>
          <ID>CName</ID>
          <ToolTip>Название контроллера</ToolTip>
          <Default>Home</Default>
        </Literal>
      </Declarations>
      <Code Language="csharp">
        <![CDATA[private readonly DataManager dataManager;

public $CName$Controller(DataManager dataManager)
{
    this.dataManager = dataManager;
    $end$
}]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

Прокомментирую некоторые важные моменты:

<Shortcut>dms</Shortcut>. В этом теге указываем комбинацию горячих клавиш, по которой будет вызывать сниппет. Важно, чтобы она не совпадала с уже существующими сниппетами.

<Namespace>WebApplication1.SecretNamespace</Namespace>. Здесь я указал, что при вставке сниппета следует также добавить в *.cs файл нужное пространство имен. В моем примере класс DataManager располагается именно там.

<Literal><ID>CName</ID><ToolTip>Название контроллера</ToolTip><Default>Home</Default></Literal>. Здесь я указал т.н. литерал, или место для подстановки. Он добавляется ниже в коде сниппета. Суть в том, что в этом месте Visual Studio предложит нам изменить стандартное значение "Home" на нужное нам. Это очень удобно, ведь не все контроллеры в приложении называются HomeController. Конечно же можно добавлять и другие литералы, актуальные для вашего кода.

<Code Language="csharp">. В значении для Language указываем тот язык, для которого создается сниппет. Важно! Что попало писать нельзя, весь список доступных языков представлен в официальной документации (ссылка выше). По указанному языку Visual Studio будет ориентироваться, где и в каком контексте в коде будет доступен данный сниппет.

<![CDATA[...code...]]>. В этой конструкции во внутренних квадратных скобках располагается тот код, который будет вставлен по требованию. По поводу форматирования кода: здесь можно особо не заморачиваться и писать весь код хоть в одну строку. Visual Studio сама проведет форматирование при вставке по тем правилам, которые в ней установлены. Также здесь в коде я указал зарезервированный служебный литерал $end$ - в это место встанет курсор, когда сниппет будет добавлен в код и настроен.

DMSnippet.snippet. Хотя файл размечен в формате XML, сохранять его следует со специальным расширением *.snippet.

После создания сниппета нам необходимо добавить его в общий список через Code Snippet Manager (кнопка Import...):

Вот так выглядит созданный сниппет. Название, описание, все на месте.
Вот так выглядит созданный сниппет. Название, описание, все на месте.

Для удобства можно сохранять свои сниппеты в папке "My Code Snippets".

Вот и все, созданный сниппет готов к работе. Теперь его можно вызывать в нужном месте в коде. Для этого начинаем набирать комбинацию горячих клавиш, и дважды жмем TAB.

 

Если у вас установлен Resharper и в подсказке Intellisense не отображается новый сниппет (но при этом работает), это значит что вы используете схему Intellisense для Resharper. Но сниппет создавался вне зоны действия решарпера, и он об этом ничего не знает. Нужно либо в опциях поменять схему на Visual Studio, либо добавить правило для решарпера.

Вернуться наверх
наверх