Code Snippets in Visual Studio

Tijdens het trainen probeer ik mijn cursisten natuurlijk zo veel mogelijk te leren over .Net en (andere) super interessante onderwerpen. Opmerkelijk hierbij is dat ze vaak erg enthousiast worden als ik ze de mogelijkheden van code snippets uitleg. Vandaar ook deze blog over het gebruik van code snippets en het zelf maken van nieuwe code snippets.
Wat is een code snippet
In je code gebruik je vaak de zelfde structuren, bijvoorbeeld een for-loop of een if-statement. Vaak ben je deze aan het uittypen, maar om het leven van de developer gemakkelijker te maken hebben ze in Visual Studio stukjes voorgedefinieerde code zitten die je eenvoudig in je code kunt plaatsen.
Er zijn 2 manieren om code snippets te gebruiken. De eerste is de omslachtigste, maar geeft wel een goed overzicht van de beschikbare snippets: Via het 'Edit' menu kies je voor 'IntelliSense' en vervolgens voor 'Insert Snippet'.

Je krijgt vervolgens een menuutje waar je de gewenste snippet kunt uitzoeken en in je code kunt plaatsen.

Als ik kies (zoals in het bovenstaande plaatje) voor 'tryf' zal er dus een 'try-finaly' blok in mijn code geplaatst worden.
Aangezien dit toch best wat handelingen zijn en de (tijd)winst dus vrij beperkt is, is er ook een snellere manier om ze op te roepen. Je typt de naam van de code snippet in en vervolgens 2x op [Tab]. Bijvoorbeeld 'foreach' [tab] [tab] levert het volgende op:

Het woordje 'var' is nu geselecteerd en kun je gemakkelijk aanpassen in het gewenste type, bijvoorbeeld 'Control'. Met de [Tab] wordt 'item' geselecteerd en is aan te passen in de naam die je de variabele wilt geven, bijvoorbeeld 'ctl'. Door nog een keer op [Tab] te drukken kunnen we aangeven welke collectie gebruikt moet worden, bijvoorbeeld 'this.Controls'.
Vervolgens plaats ik de cursor in tussen de accolades van de foreach-statement en gebruik een volgende code snippet: 'mbox' [tab] [tab]. De code voor het weergeven van een messagebox wordt ingevoegd en hier kan ik aangeven dat ik de 'ctl.Name' wil tonen.

Je ziet hoe snel, makkelijk en zonder fouten je nu code kunt genereren. Bij elke versie van Visual studio komen er meer code snippets bij. Zo zullen er in Visual Studio 2010 ongeveer 200 code snippets beschikbaar zijn. Niet alleen voor C# en VB, maar ook voor HTML en Javascript.
Zelf creëren van code snippets
Naast de bestaande code snippets is het ook mogelijk om je eigen snippets te maken. Op deze manier kun je dus binnen snel stukken code in voeren die je zelf vaak gebruikt. Bijvoorbeeld het aanmaken van database connecties, datasets, standaard opzet voor classes, etc.
Ik ga nu een code snippet maken voor het snel invoegen van een property. 'Die bestaat toch al', zul je jezelf afvragen. Dat klopt, maar in Visual Studio 2008 is deze anders dan in Visual Studio 2005 terwijl ik die in 2005 veel handig vind en graag in 2008 ook zou willen hebben.
In VS2005 zit er een code snippet 'prop' die een private variable aanmaakt en een property met een getter en een setter. Omdat in het VS2008 niet meer per se nodig is om de getter en setter uit te werken, levert de code snippet 'prop' het volgende resultaat in VS2008:

In veel gevallen prima, maar vaak wil ik niet de default getter of setter, maar wil ik daar wat intelligentie aan koppelen en dan ben ik toch weer een hoop aan het uit typen. De oplossing is dus zelf een nieuwe snippet aanmaken. Het resultaat is onderstaande snippet.

Als ik het type van de private variabele aanpas, dan wordt ook automatisch het type van de property aangepast en als ik de naam van de variabele aanpas, dan wordt dat ook automatisch in de property doorgevoerd. Super handige en snelle manier om een property te maken dus. Hoe gaat dit nu in zijn werk?
Stap 1 is het maken van een XML file, met de extensie '.snippet'. In mijn voorbeeld wordt het 'propertyComplete.snippet'.
Stap 2 is het schrijven van de XML voor de snippet. Een lege snippet ziet er als volgt uit:
<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title></Title>
<Shortcut></Shortcut>
<Description></Description>
<Author></Author>
<SnippetTypes>
<SnippetType></SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations></Declarations>
<Code Language="CSharp">
<![CDATA[
]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
Je ziet dat het bestand een Header bevat met informatie over de snippet (title, description, shortcut, etc.). Daarnaast is er een element 'snippet' waarin de daadwerkelijke code geplaatst gaat worden. Ook kunnen we in dit element de 'Declarations' plaatsen. Deze declarations zijn de onderdelen van de snippet die we kunnen wijzigen en waar we met de [Tab] toets naar toe kunnen springen (de groene en blauwe vlakjes van de snippet dus). Hieronder vind je de complete snippet, met de ingevulde header, de declaraties en de code.
<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>Property complete</Title>
<Shortcut>propc</Shortcut>
<Description>
Code snippet for placing a property, fully written. Like "prop" in VS2005
</Description>
<Author>Christian Peeters</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>field</ID>
<ToolTip>backing store</ToolTip>
<Default>myVar</Default>
</Literal>
<Literal>
<ID>type</ID>
<ToolTip>Property type</ToolTip>
<Default>int</Default>
</Literal>
<Literal>
<ID>property</ID>
<ToolTip>Property name</ToolTip>
<Default>MyProperty</Default>
</Literal>
</Declarations>
<Code Language="CSharp">
<![CDATA[
private $type$ $field$;
public $type$ $property$
{
set {return this.$field$;}
set {this.$field$ = value;}
}
$end$
]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
Je ziet hoe de declaraties een ID, tooltip en default value hebben en dat deze vervolgens in de code gebruikt worden.
De snippet is nu klaar. Als laatste stap moeten we de snippet nog in Visual Studio bekend maken. Daarvoor gebruiken we de 'Code Snippet Manager' die je kunt vinden onder het menu-item 'Tools'.
Klik op 'Add' en verwijs naar de map waar de snippet staat.

De snippet wordt herkend en voortaan kan ik 'propc' gebruiken om een compleet uitgewerkte property in mijn code te krijgen!
Meer Informatie
Het is misschien één keer wat werk, maar vervolgens kun je er een hoop lol van hebben, dus ik zou zeggen; probeer het een keer. Op de MSDN site kun je meer informatie vinden over het creëren van code snippets: http://msdn.microsoft.com/en-us/library/ms165393(VS.80).aspx
Gerelateerde items op www.master-it.nl: Visual Studio 2008 training, Visual Studio 2005 training, Alle Development trainingen
Op dit moment ben ik bezig met het lezen van Apress Pro Asp for Sql en wilde graag snippets gebruiken for aanmaken van database en connectionStrings maar mijn VS2005 ziet geen 'Database' of is dat de naam van mijn DB en intelisense voor DatabaseFactory.CreateDatabase(string) is ook niet "supported" , kunt U dat ook op Uw blog uitleggen of gewoon een tip geven
Bij voorbaat dank
Beste Igor,
De classes waar jij over schrijft zijn afkomstig uit de Microsoft "Paterns & Practices" - Enterprice Library. Deze kun je downloaden http://msdn.microsoft.com/en-us/library/cc467894.aspx
en vervolgens een reference toevoegen aan je project. Bovenin ook een "using" toevoegen zodat de namespace bekend is in je code.
Als het goed is zal intellisense nu wel deze classes en methodes kennen. Ik weet zo niet of er dan ook codesnippets beschikbaar zijn, maar eventueel kun je die zelf maken.
De .snippet files schrijven kan soms wat lastig zijn. Makkelijker is de volgende tool:
http://snippetdesigner.codeplex.com/
Een project om met via een grafische interface makkelijk je eigen snippets te maken.
Vul onderstaand formulier volledig in om een reactie op dit bericht te plaatsen.
