Можно дать такое определение:
Другими словами, можно заключить в контейнер код, который приходится часто писать вручную, и потом нажимая комбинацию горячих клавиш, вставлять данный код по требованию. Тем самым экономится очень много времени.
Все сниппеты можно найти через специальный менеджер, который находится в меню по адресу Tools > Code Snippets Manager...:
Через этот менеджер можно посмотреть список всех стандартных сниппетов для разных языков программирования, которые представлены в Visual Studio и которые можно использовать. Также можно добавить свой собственный сниппет, используя кнопку Import...
Создаем свой 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-шаблон на следующий:
<?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, либо добавить правило для решарпера.