Думаю, есть время поделиться моими любимыми и наиболее часто используемыми сниппетами.
Предназначены мои любимые сниппеты для такой прозаической задачи, как проверка аргументов на null. Поскольку, с использованием сниппетов добавлять такие проверки стало гораздо быстрее и удобнее, не составляет труда добавлять проверки всюду, где в них есть необходимость, даже если сделать это нужно для нескольких параметров, а это позволяет писать более правильный, более безопасный код, ибо чем раньше мы обнаружим проблему, тем быстрее, проще и безопаснее для всего остального сможем её исправить.
Не секрет, что для упрощения проверок аргументов на null изобретено не мало средств: от использования возможностей языка\компилятора до специальных инструментов a-la CodeContracts, аннотоций ReSharper-а или колдунства PostSharp-а.
Мне всё это (пока что) кажется излишним оверхедом: тратить время на разбор выражений обидно, с контрактами действительно пока не всё понятно, завязываться же на инструмент третий стороны не хочется вовсе.
Итак, как делаю я: написав объявление метода и операторные скобки к нему, обозначив тело:
void MyMethod(object param1, object param2) {
| // <- это позиция курсора в редакторе
}
…набираю "an" (это shortcut для сниппета), жму Tab и получаю:
if(ArgName == null) {
throw new ArgumentNullException("ArgName");
}//if
Осталось ввести имя аргумента (курсор уже там, где нужно, в выделенном квадрате + помогает IntelliSense) и нажать Enter:
void MyMethod(object param1, object param2) {
if(param1 == null) {
throw new ArgumentNullException("param1");
}//if
|
}
Можно приступать к написанию тела метода.
Но если нужно проверить и второй параметр, то ставлю курсор перед закрывающей скобкой: }//if:
void MyMethod(object param1, object param2) {
if(param1 == null) {
throw new ArgumentNullException("param1");
|}//if
}
…набираю "an2", жму Tab и получаю:
void MyMethod(object param1, object param2) {
if(param1 == null) {
throw new ArgumentNullException("param1");
} else if(ArgName == null) {
throw new ArgumentNullException("ArgName");
}//if
}
Опять быстро с помощью IntelliSense ввожу имя второго параметра, жму Enter:
void MyMethod(object param1, object param2) {
if(param1 == null) {
throw new ArgumentNullException("param1");
} else if(param2 == null) {
throw new ArgumentNullException("param2");
}//if
|
}
Вот так вот несколькими нажатиями я "набираю" довольно много нужного кода.
В добавок к сниппетам "an" и "an2" у меня есть сниппеты ("ans" и "ans2" соответственно) для проверки строк, которые отличаются от первых тем, что вместо проверки на null в условии выполняется проверка аргумента с помощью String.IsNullOrEmpty(string).
Выглядит первый ("an") сниппет так:
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>Throws ArgumentNullException</Title>
<Shortcut>an</Shortcut>
<Description>Code snippet for throws ArgumentNullException</Description>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
<Author>Viacheslav.Ivanov@GMail.com</Author>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>ArgumentName</ID>
<ToolTip>Name of the argument</ToolTip>
<Default>ArgName</Default>
</Literal>
<Literal Editable="false">
<ID>ArgumentNullException</ID>
<Function>SimpleTypeName(global::System.ArgumentNullException)</Function>
<ToolTip>Type of the exception</ToolTip>
</Literal>
</Declarations>
<Code Language="CSharp">
<![CDATA[if($ArgumentName$ == null) {
throw new $ArgumentNullException$("$ArgumentName$");
}//if
$end$]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
Остальные сниппеты такие (привожу здесь только "значимую" часть, упустив заголовок):
Проверка второго и последующих аргументов на null ("an2"):
<Code Language="CSharp">
<![CDATA[} else if($ArgumentName$ == null) {
throw new $ArgumentNullException$("$ArgumentName$");$end$]]>
</Code>
Проверка строки на IsNullOrEmpty ("ans"):
<Snippet>
<Declarations>
<Literal>
<ID>ArgumentName</ID>
<ToolTip>Name of the argument</ToolTip>
<Default>ArgName</Default>
</Literal>
<Literal Editable="false">
<ID>String</ID>
<Function>SimpleTypeName(global::System.String)</Function>
<ToolTip>System.String type</ToolTip>
</Literal>
<Literal Editable="false">
<ID>ArgumentNullException</ID>
<Function>SimpleTypeName(global::System.ArgumentNullException)</Function>
<ToolTip>Type of the exception</ToolTip>
</Literal>
</Declarations>
<Code Language="CSharp">
<![CDATA[if($String$.IsNullOrEmpty($ArgumentName$)) {
throw new $ArgumentNullException$("$ArgumentName$");
}//if
$end$]]>
</Code>
</Snippet>
Проверка второго и последующий аргументов строкового типа на IsNullOrEmpty ("ans2"):
<Code Language="CSharp">
<![CDATA[} else if($String$.IsNullOrEmpty($ArgumentName$)) {
throw new $ArgumentNullException$("$ArgumentName$");$end$]]>
</Code>
Скачать готовые сниппеты можно отсюда. О том, как их подключить к MSVS можно прочитать в статье How to: Manage Code Snippets.