Это вторая часть статьи про сниппеты. В первой давалось разъяснение, что это за механизм, для чего он нужен и как его применять. Во второй части речь пойдет про то, как сниппеты создавать.
Для примера возьмем очень простую обобщенную ситуацию: необходимость хранить скрытые временные данные в теле страницы. Ранее для этого использовали скрытые поля, но в asp.net есть механизм ViewState. Я не буду касаться темы использования ViewState, его влияния на производительность и размер страницы. Очевидно, что использовать его нужно аккуратно. Так вот, создадим сниппет для такой вот конструкции кода:
Простейшее свойство, значение которого будет храниться не в закрытом поле, как обычно, а во ViewState. Обратите внимание, что в этом коде три изменяемых элемента: тип, имя и значение по умолчанию. Причем строка типа в коде используется дважды, а строка имени трижды. Теперь давайте определим, наконец-то сниппет. На самом деле сниппет – это определенный особым образом xml-файл и вот реализация для нашего примера:
Итак, что же представляет собой описание данного сниппета. Основные тэги следующие: Header, который описывает скорее внешнюю часть и Snippet, который описывают логику.
В Header определяются тэги со значениями: наименования сниппета, шортката (это название по которому можно быстро вызвать сниппет), описания, автора, и типа сниппета. Тип сниппета может иметь три значения: SurroundsWith, Expansion и Refactoring. Первый указывает но то, что сниппет будет оборачивать выделенный текст (так делает стандартный сниппет region), второй – на то, что текст сниппета просто вставится, а третий используется для встроенного в студию механизма рефакторинга и не может использоваться в пользовательских сниппетах.
В Snippet декларируются литералы, значение которых можно будет редактировать при использовании сниппета, и собственно код сниппета. Обратите внимание на то, как определяется литерал: указывается его идентификатор, подсказка и значение по умолчанию. Идентификатор литерала затем используется в теле кода сниппета. Для выделения литерала, он заключается между двумя знаками доллара «$». Тэг Code содержит кроме определения кода сниппета еще и несколько атрибутов: Language, который указывает на целевой язык сниппета и может принимать значения VB, CSharp, VJSharp, или XML; Delimiter, который позволяет переопределить знак доллара на другой символ; и Kind, который позволяет указать сферу применения сниппета и принимает значения «method body», «method decl», «type decl», file, или any. В нашем случае Kind опущен, но его можно указать как «type decl».
После создания файла сниппета его нужно как-то внедрить в студию. Для этого используем стандартный диалог «Code Snippets Manager» в меню Tools главного меню сутдии. Если его у вас там нет, то значит ваш enviroment так настроен и пункт меню вы сможете отыскать в Tools\Customize – Commands – Tools. Можно сделать проще и вызвать диалог шорткатом ctrl+k, ctrl+b. В окне можно указать в какой раздел сохранить сниппет и нажав кнопку import импортировать ваш сниппет в студию. После этого вы можете набрать propv в редакторе и нажать tab. У вас должен добавиться текст вроде этого:
На этом все. Для полноты изложения дам ссылку на описание схемы xml-файла сниппета:
хттп://msdn.microsoft.com/ru-ru/library/ms171418(en-us,vs.80).aspx (к сожалению, из-за скобок в урл, Хабр неверно выделяет гиперлинк, скопируйте его в браузер как есть). Там можно подчерпнуть дополнительные знания и научится делать еще более сложные и полезные сниппеты.
PS: «в статье нет ошибок!» — к сожалению утверждать этого невозможно, но я буду рад, если вы обратите мое внимание на найденную вами ошибку.
Для примера возьмем очень простую обобщенную ситуацию: необходимость хранить скрытые временные данные в теле страницы. Ранее для этого использовали скрытые поля, но в asp.net есть механизм ViewState. Я не буду касаться темы использования ViewState, его влияния на производительность и размер страницы. Очевидно, что использовать его нужно аккуратно. Так вот, создадим сниппет для такой вот конструкции кода:
public int ViewStatePropperty { get { object o = ViewState[«ViewStatePropperty»]; return (o != null)? (int)o: 0; } set { ViewState[«ViewStatePropperty»] = value; } }* This source code was highlighted with Source Code Highlighter.
Простейшее свойство, значение которого будет храниться не в закрытом поле, как обычно, а во ViewState. Обратите внимание, что в этом коде три изменяемых элемента: тип, имя и значение по умолчанию. Причем строка типа в коде используется дважды, а строка имени трижды. Теперь давайте определим, наконец-то сниппет. На самом деле сниппет – это определенный особым образом xml-файл и вот реализация для нашего примера:
<?xml version=«1.0» encoding=«utf-8» ?>
<CodeSnippets xmlns=«schemas.microsoft.com/VisualStudio/2005/CodeSnippet»>
<CodeSnippet Format=«1.0.0»>
<Header>
<Title>propv</Title>
<Shortcut>propv</Shortcut>
<Description>Простой пример сниппета</Description>
<Author>Xaoc, для проекта Habrahabr</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>type</ID>
<ToolTip>Property type</ToolTip>
<Default>int</Default>
</Literal>
<Literal>
<ID>property</ID>
<ToolTip>Property name</ToolTip>
<Default>MyProperty</Default>
</Literal>
<Literal>
<ID>default</ID>
<ToolTip>Default value</ToolTip>
<Default>0</Default>
</Literal>
</Declarations>
<Code Language=«csharp»><![CDATA[public $type$ $property$
{
get
{
object o = ViewState["$property$"];
return (o != null)? ($type$)o: $default$;
}
set
{
ViewState["$property$"] = value;
}
}$end$]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>* This source code was highlighted with Source Code Highlighter.
Итак, что же представляет собой описание данного сниппета. Основные тэги следующие: Header, который описывает скорее внешнюю часть и Snippet, который описывают логику.
В Header определяются тэги со значениями: наименования сниппета, шортката (это название по которому можно быстро вызвать сниппет), описания, автора, и типа сниппета. Тип сниппета может иметь три значения: SurroundsWith, Expansion и Refactoring. Первый указывает но то, что сниппет будет оборачивать выделенный текст (так делает стандартный сниппет region), второй – на то, что текст сниппета просто вставится, а третий используется для встроенного в студию механизма рефакторинга и не может использоваться в пользовательских сниппетах.
В Snippet декларируются литералы, значение которых можно будет редактировать при использовании сниппета, и собственно код сниппета. Обратите внимание на то, как определяется литерал: указывается его идентификатор, подсказка и значение по умолчанию. Идентификатор литерала затем используется в теле кода сниппета. Для выделения литерала, он заключается между двумя знаками доллара «$». Тэг Code содержит кроме определения кода сниппета еще и несколько атрибутов: Language, который указывает на целевой язык сниппета и может принимать значения VB, CSharp, VJSharp, или XML; Delimiter, который позволяет переопределить знак доллара на другой символ; и Kind, который позволяет указать сферу применения сниппета и принимает значения «method body», «method decl», «type decl», file, или any. В нашем случае Kind опущен, но его можно указать как «type decl».
После создания файла сниппета его нужно как-то внедрить в студию. Для этого используем стандартный диалог «Code Snippets Manager» в меню Tools главного меню сутдии. Если его у вас там нет, то значит ваш enviroment так настроен и пункт меню вы сможете отыскать в Tools\Customize – Commands – Tools. Можно сделать проще и вызвать диалог шорткатом ctrl+k, ctrl+b. В окне можно указать в какой раздел сохранить сниппет и нажав кнопку import импортировать ваш сниппет в студию. После этого вы можете набрать propv в редакторе и нажать tab. У вас должен добавиться текст вроде этого:
public int MyProperty { get { object o = ViewState[«MyProperty»]; return (o != null)? (int)o: 0; } set { ViewState[«MyProperty»] = value; }}* This source code was highlighted with Source Code Highlighter.
На этом все. Для полноты изложения дам ссылку на описание схемы xml-файла сниппета:
хттп://msdn.microsoft.com/ru-ru/library/ms171418(en-us,vs.80).aspx (к сожалению, из-за скобок в урл, Хабр неверно выделяет гиперлинк, скопируйте его в браузер как есть). Там можно подчерпнуть дополнительные знания и научится делать еще более сложные и полезные сниппеты.
PS: «в статье нет ошибок!» — к сожалению утверждать этого невозможно, но я буду рад, если вы обратите мое внимание на найденную вами ошибку.