Creare degli snippet di codice personalizzati all'interno di Visual Studio può essere molto utile soprattutto se si hanno parti di codice che si ripetono spesso ma che non si possono "astrarre" in alcun modo.

Durante lo sviluppo di web form quando definiamo delle proprietà su una pagina, di default il loro valore non viene mantenuto tra i vari postback. Un modo per ovviare a questa mancanza è salvare le proprietà nella viewstate, questo significa che ogni volta che vogliamo accedere a questi valori dobbiamo controllare che l'oggetto nella viewstate sia non nullo, del tipo giusto e poi eseguire un cast al tipo voluto.

Volendo semplificare l'accesso alla viewstate utilizziamo le proprietà in questo modo:

public int MioIntero
{
    get
    {
        if (ViewState["MioIntero"] == null)
            return 0;

        return (int)ViewState["MioIntero"];
    }
    set
    {
        ViewState["MioIntero"] = value;
    }
}

 

In questo modo tramite il get ed il set della proprietà MioIntero salviamo nella viewstate e recuperiamo i valori in maniera semplice e veloce. Avendo diverse di queste proprietà, è necessario scrivere diverse volte lo stesso codice o effettuare un copia-incolla con il rischio di dimenticare di modificare le stringhe con cui recuperiamo dalla viewstate.

Visual Studio contiene diversi snippet di codice che permettono di inserire proprietà nelle classi, ad esempio "prop" o "propfull". Vediamo come creare uno snippet "propview" per inserire una proprietà del tipo visto poco fa.

Uno snippet di Visual Studio è un file xml contenente del markup particolare, come riferimento si possono prendere gli snippet di default presenti nella cartella (per una versione inglese di VS2013)

%programfiles(x86)%\Microsoft Visual Studio 12.0\VC#\Snippets\1033\Visual C#

In particolare guardiamo il file xml di "propfull"

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
	<CodeSnippet Format="1.0.0">
		<Header>
			<Title>propfull</Title>
			<Shortcut>propfull</Shortcut>
			<Description>Code snippet for property and backing field</Description>
			<Author>Microsoft Corporation</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>field</ID>
					<ToolTip>The variable backing this property</ToolTip>
					<Default>myVar</Default>
				</Literal>
			</Declarations>
			<Code Language="csharp"><![CDATA[private $type$ $field$;
 
	public $type$ $property$
	{
		get { return $field$;}
		set { $field$ = value;}
	}
	$end$]]>
			</Code>
		</Snippet>
	</CodeSnippet>
</CodeSnippets>

Le modifiche da apportare sono pochissime:

  • Title
  • Shortcut
  • Description
  • Author
  • Code
La scelta di "propfull" non è stata a caso, i tag declaration e literal ci permettono di definire quelle stringhe che si ripetono più volte e che vengono cambiate tutte in automatico modificandone una sola. Un comportamento utile e familiare a chiunque abbia usato propfull più di una volta. Vediamo quindi il markup xml definitivo
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets
    xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>Proprietà ViewState</Title>
      <Shortcut>propviewstate</Shortcut>
      <Description>Snippet di codice per proprietà viewstate</Description>
      <Author>React Consulting</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>
			</Declarations>
      <Code Language="CSharp">
        <![CDATA[public $type$ $property$
    {
        get
        {
            if (ViewState["$property$"] == null)
                return default($type$);
 
            return ($type$)ViewState["$property$"];
        }
        set
        {
            ViewState["$property$"] = value;
        }
    }]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>
comments powered by Disqus