Link utili della settimana

  1. Descrizione di Unity, il framework di Inversion of Control e Dipendency Injection sviluppato dal team di P&P (qui è presente la versione 1.2 per Silverlight)
  2. 45 passi per diventare agili
  3. xVal, libreria per la validazione client side di applicazioni ASP .NET MVC
  4. Anti XSS Library ver. 3.1
  5. CodePad .NET 1.0 Beta 2, un editor leggero per provare spezzoni di codice
  6. Strongly typed session variables in ASP .NET MVC
  7. Visual Studio 2010 e .NET Framework 4.0 Training Kit – May preview

i4o (ovvero index for objects)

Per chi (come me) utilizza LINQ  questo progetto presente su Codeplex è senz’altro interessante.

Come è noto LINQ  effettua  le ricerche in modo sequenziale, cosa che su collezioni con parecchi items può dar luogo ad un degrado delle prestazioni.

Questo progetto si prefigge come obiettivo quello di dotare LINQ della ricerca indicizzata degli elementi, che, stando a quanto riportato nella descrizione del progetto, è in grado di rendere le query oltre mille volte più veloci rispetto alla ricerca sequenziale.

Il progetto è attualmente in Beta 3, e non ci sono rilasci pianificati.

Sarebbe interessante da provare (avendone il tempo !).

Se qualcuno lo ha già fatto sarei lieto di leggerele impressioni di utilizzo.

Invocazione di metodo remoto da Javascript

A partire da ASP .NET 3.5 è possibile da JavaScript richiamare un metodo esterno, implementato nella stessa pagina aspx che invoca il codice Javascript, oppure in un ASP .NET XML Web Services (per intenderci, quello in formato .asmx), oppure in un WCF Services (in formato .svc), tutto questo senza passare attraverso il normale ciclo di vita della pagina, ma invocando semplicemente un metodo pubblico di una classe, visto che la pagina aspx è una classe a tutti gli effetti.

Al metodo è possibile passare dei parametri e ricevere indietro un valore di ritorno, che sarà serializzato / deserializzato in modalità JSON.

Se si ha la necessità di eseguire codice lato server senza passare dall’intero ciclo di vita della pagine, invocare un metodo pubblico della pagina è sicuramente la soluzione più veloce da implementare, poichè non necessita di creare una applicazione a sè stante (il web service o il WCF Service), e quindi è anche più facile da installare e da manutenere, ma non è esente da limitazioni, la maggiore delle quali è l’impossibilità di richiamare il metodo pubblico da parte di pagine diverse rispetto a quella in cui lo stesso è dichiarato (in tal caso è necessario creare un servizio web, ASP .NET XML Web Service oppure WCF Service).

Di seguito i passi necessari per richiamare un metodo pubblico esposto dalla classe che genera la pagina aspx, da codice Javascript:

  • E’ necessario creare un metodo pubblico e statico all’interno della classe che identifica la pagina aspx e decorarlo con l’attributo System.Web.Services.WebMethodAttribute;
[WebMethod]
public static string GetValueFromServer(string param1, string param2)
{
    return "TEST_RETURN_VALUE";
}
    • E’ necessario assegnare True alla proprietà  EnablePageMethods dell’oggetto ScriptManager ospitato dalla pagina in questione (il valore di default è False), per abilitare l’invocazione di metodi di pagina;
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
  • I due passaggi precedenti fanno in modo che nella pagina aspx sia iniettato del codice di script (inline) che permette di richiamare il “Web Method”. Questo codice di script comprende essenzialmente un oggetto chiamato “PageMethods“, il cui nome è hardcoded e quindi non modificabile, avente metodi statici con lo stesso nome dei metodi statici di pagina, mediante cui è possibile richiamare questi ultimi passando gli opportuni parametri, e indicando una funzione di callback che sarà automaticamente richiamata al termine dell’invocazione del metodo remoto e che conterrà il valore di ritorno di quest’ultimo, piu un metodo di callback opzionale che sarà automaticamente richiamato in caso di errore del metodo remoto.
function Function1 {
    PageMethods.GetValueFromServer( param1, param2, onSuccessfullCall, onErrorCall);
}
  • La funzione di callback richiamata in caso di errore è opzionale. Occorre tener presente che l’invocazione del metodo remoto è asincrona, quindi il controllo tornerà immediatamente al codice Javascript chiamante. Al termine della invocazione del metodo sarà invocata automaticamente la funzione di callback opportuna (chiamata conlusa con successo o con errore). Nel caso di chiamata conclusa con esito positivo, la funzione di callback conterrà anche il valore di ritorno del metodo remoto invocato.
function onSuccessfullCall(results, userContext, methodName) {
    alert(results);
}
 
function onErrorCall(error, userContext, methodName) {
    if (error !== null)
        alert(error.get_message());
}
  • Il parametro results della funzione di callback richiamata in caso di invocazione riuscita conterrà il valore di ritorno del metodo remoto

</RSSBandit>

Stanco ormai di ricevere ogni 3×2 un messaggio di errore di RSSBandit che mi indica un errore fatale nel caricamento del file XML contenente i feeds sottoscritti, obbligandomi a caricare una copia di backup (che potrebbe essere non aggiornata) dello stesso file con l’antipatica conseguenza di ritrovarmi con tutti i feeds impostati sullo stato di “Unread” (cosa davvero antipatica se si hanno tanti feeds sottoscritti),  ho deciso di cambiare aggregator. Da oggi sto utilizzando FeedDemon 3 (RC4).

E’ ancora in versione Beta (la versione 3), ma ne parlano molto bene nelle recensioni che ho letto sulla rete.

Inoltre, è possibile sincronizzare i feeds con Google Reader, feature utile se non si utilizza sempre lo stesso PC.

Speriamo di non avere gli stessi problemi avuti con RSSBandit

C# 4.0 – Parametri opzionali

Leggo che tra le nuove feature di C# 4.0 c’è la possibilità di indicare come opzionali i parametri di un metodo o di un costruttore, in tal caso il parametro viene inizializzato con un valore di default fornito dal programmatore.

Una cosa di questo tipo:

public Person(string firstName, string lastName, string city = "")
{    
        //
}

che può essere istanziata in entrambi le modalità:

Person p = new Person("Maurizio", "Tammacco");
Person p1 = new Person("Maurizio", "Tammacco", "Bari");

Nel primo esempio, poichè il parametro “City” è opzionale, viene automaticamente assegnato il valore di default, ovvero stringa vuota in questo caso.

Sinceramente questa nuova funzionalità non mi entusiasma per niente, anzi la ritengo quasi inutile visto che comunque una funzionalità analoga è possibile ottenerla con le “Automatic properties”, ovvero proprietà pubbliche inizializzabili nella stessa istruzione che crea l’istanza di un oggetto, anche se questa funzionalità riguarda comunque un membro definito come proprietà.

I parametri opzionali sono da sempre presenti in Visual Basic, sin dalla versione 6 e poi anche nelle varie versioni .NET. Questo comportava che, in caso di interoperabilità tra i due linguaggi, il codice C# che richiamava un metodo scritto in VB .NET con parametri opzionali era costretto a passargli comunque tutti i parametri, opzionali e non;  la stessa cosa accadeva nell’utilizzo della COM Interop da C#. Adesso non sarà più necessario passare i parametri opzionali, ma, ripeto, a mio avviso l’utilità di questa funzionalità è discutibile, e riguarda unicamente una più stretta compatibilità tra i due linguaggi più usati nel mondo .NET.

ASP .NET 4.0 #2 Servizi "provider based"

Proseguendo nell’analisi delle nuove feature di ASP .NET 4.0 è evidente che l’architettura a providers, di cui tempo fa ho parlato in un articolo apparso su DotNetSide, è sempre più usata in modo intensivo per rendere quanto più modulare e personalizzabile l’application framework a disposizione.

Con la nuova versione di ASP .NET infatti questa architettura noto che sarà introdotta nei servizi di Output Caching, Browser Capabilities e Auto Start Application, almeno dalla documentazione in mio possesso.

Output Caching

Uno dei grossi limiti dell’ output caching delle precedenti versioni di ASP .NET è la limitatà flessibilità sul repository di memorizzazione dei dati in cache (output). Questi infatti potevano essere memorizzati solo nella memoria del server e da nessun altra parte. Come è facile intuire con la nuova versione è possibile scriversi un provider personalizzato per la memorizzazione dei dati e quindi utilizzare qualsivoglia repository a disposizione (es. disco locale, disco di rete, database, ecc)

Auto Start Application

Se si utilizza IIS 7.5 e Windows Server 2008 R2 insieme ad ASP .NET 4.0, è possibile far in modo che una applicazione si avvii in automatico ed esegua del codice di inizializzazione. Questo scenario si applica soprattutto a quelle applicazioni che necessitano di tempi lunghi per inizializzarsi, e quindi per evitare che questo overhead ricada totalmente sulla prima richiesta è possibile eseguire questo codice allo start-up automatico, ovvero senza che ci sia una richiesta di pagina esplicita. Questo codice può essere incapsulato in una classe provider, e quindi si possono avere n provider da utilizzare all’occorrenza in base alle specifiche esigenze.

Browser Capabilities

Questa funzionalità nelle precedenti versioni era fruibile solo mediante la modifica di files xml (.browser), a livello di macchina o di singola applicazione. Questi files xml non sono proprio il massimo per descrivere funzionalità come quelle del browser. Ora è possibile definire proprie funzionalità a livello di browser mediante l’uso di classi “provider based”

ASP .NET 4.0 #1 Nuova proprietà ViewStateMode

Per una applicazione ASP .NET soprattutto di livello enterprise la gestione del viewstate è sempre stato uno degli aspetti più delicati e, aggiungo io, più bistrattati in assoluto. Spesso e volentieri ho visto applicazioni di una certa complessità che ignorano completamente questo aspetto, che si traduce in pratica nell’utilizzo del valore di default della proprietà EnableViewState dei controlli di pagina (ovvero True), con conseguente saltataggio dei valori dello stato per tutti i controlli, a prescindere se questo salvataggio ha senso oppure no.

Anzi, spesso ho addirittura visto un utilizzo del ViewState a mò di Session, ovvero ho visto salvare informazioni aggiuntive rispetto allo stato dei controlli, e non parlo di tipi primitivi ma di veri e propri oggetti complessi, la cui serializzazione nel markup html provoca inevitabilmente un incremento notevole del peso della pagina web, con conseguenze facilmente immaginabili.

Con la prossima uscita della versione 4.0 di ASP .NET, lo sviluppatore avrà un controllo più fine sull’utilizzo del ViewState, soprattutto potrà impostare il valore di default desiderato in funzione della pagina che lo utilizza. Infatti, ogni server control (e quindi anche la classe Page) avrà a disposizione la proprietà ViewStateMode che potrà permettere ai controlli child situati all’interno di un contenitore (e quindi a tutti i controlli della pagina se guardiamo il livello più alto della gerarchia dei controlli), di ereditare la modalità di utilizzo dal rispettivo controllo container (valore Inherit), oppure di abilitare (Enabled) o disabilitare (valore Disabled) esplicitamente il Viewstate per un singolo controllo a prescindere dal valore impostato nel container.

Poichè il valore di default di questa nuova proprietà è Inherit, significa che a livello di pagina nessun controllo avrà il ViewState abilitato se non esplicitamente impostato dal programmatore.

Secondo me è un buon passo avanti verso la scrittura di applicazioni più efficienti.

Piccolo sfogo…

Una pensiero che spesso mi viene in mente guardando il codice sorgente è: ma perchè scrivere in 10 righe di codice quello che potrebbe essere scritto in una o due righe ?

Aggiornare in JavaScript la pagina chiamante in partial-rendering

Mediante JavaScript è possibile eseguire programmaticamente un post della pagina mediante il richiamo della funzione

 __doPostBack( 'EventName', 'EventArgs' );

In questo caso il post generato è sincrono, ma, come ben spiegato in questo post, è anche possibile effettuarlo asincrono mediante l’utilizzo di un array della classe PageRequestmanager, in questo modo:

function doPostBackAsync( eventTargetName, eventArgs )
{
     var prm = Sys.WebForms.PageRequestManager.getInstance();
     if( !Array.contains( prm._asyncPostBackControlIDs, eventTargetName) )
     {
         prm._asyncPostBackControlIDs.push(eventTargetName);
     }
     if( !Array.contains( prm._asyncPostBackControlClientIDs, eventTargetName) )   
     {
         prm._asyncPostBackControlClientIDs.push(eventTargetName);
     }

    __doPostBack( eventTargetName, eventArgs );    
}

Mediante poi l’utilizzo dell’UpdatePanel otteniamo che a livello programmatico (quindi senza necessariamente l’interazione dell’utente mediante un controllo), possiamo generare un post asincrono con refresh parziale della pagina, mediante il richiamo esplicito della funzione di cui sopra.

Inoltre, poichè in Javascript è anche possibile, richiamare esplicitamente una funzione definita dall’utente in una pagina mentre ci si trova in un altra pagina (esempio popup), mediante il seguente costrutto:

window.opener.nomeFunzioneCustom(parametri); 

otteniamo che, stando un una pagina secondaria come un popup, riusciamo ad aggiornare con il partial rendering la pagina chiamante.

Visual Studio Addin – ecco quelli che uso io

L’utilizzo degli add-in di Visual Studio 2008 consente di incrementare a volte notevolmente la produttività di chi sviluppa, ad esempio rendendo possibile effettuare con pochi click operazioni ripetitive e lunghe. Tratto da Visual Studio Gallery, ecco la serie di add-in, rigorosamente free, che utilizzo giornalmente durante l’attività di sviluppo del software:

Regionerate, permette di creare in automatico le regioni di codice su un intero file, applicando un layout predefinito o scelto tra i layout forniti. Uno dei layout a corredo addirittura effettua il conteggio automatico degli items presenti in ogni regione e lo inserisce nel nome della stessa. E’ anche possibile crearsi propri layout o scaricarli. Davvero utile.

PowerCommands, add-in abbastanza conosciuto e molto utile, anche se responsabile di un crash documentato di Visual Studio, di cui ho già parlato qui e qui. Trattasi di una serie di comandi aggiuntivi sistemati in diversi punti dell’IDE. I principali comandi che uso sono:
Show All Files (Solution Explorer, a livello di nodo solution)
Questo comando mostra tutti i file per tutti i progetti caricati nella soluzione attiva, e non solo invece per il progetto attivo, come opera invece il comando omonimo a livello di progetto;
Collapse Projects. Questo comando collassa il nodo selezionato e contemporaneamente tutti i suoi sottonodi. La funzionalità fornita dalla Treeview del Solution Explorer invece collassa solo il nodo selezionato, lasciando invariato lo stato dei suoi sottonodi;
Copy Class. Come si può intuire, questo comando copia una intera classe o nodo nella Clipboard, permettendo di incollarla altrove (comando Paste Class) dopo averla opportunamente rinominata per evitare errori di compilazione;
Copy References (e Paste References). Copia una reference o un set di reference nella Clipboard, per poi incollarla altrove;
Open Containing Folder (davvero utile). Dal nodo di un progetto o item, apre una finestra di Windows Explorer che punta al path fisico del progetto (o dell’item) puntato;
Open Command Prompt, simile a Open Containing Folder, ma apre un prompt dei comandi invece che una finestra di windows explorer;
Remove and Sort Usings, altro comando utilissimo, elimina tutti gli using inutili e ordina quelli indispensabili, in un colpo solo, per singola classe o per tutte le classi di un progetto;
Extract Constant, dall’editor di codice, crea la definizione di costante per la stringa selezionata;
Clear Recent Project List, elimina la lista degli ultimi progetti aperti, permettendo di selezionarli.

Sticky Notes, fornisce una windows dockable nella quale scrivere appunti, una per ogni file. Funzionalità sinceramente non utilissima perchè è comunque possibile inserire i propri appunti in un file sorgente a mo’ di commento oppure utilizzare la window Task List. L’unico vantaggio è la possibilità di eliminare i propri appunti in un colpo solo o di inviarli per posta elettronica;

Clone Detective, ho già parlato qui di questo tool. Consente di cercare facilmente codice duplicato all’interno della propria solution.

Export code as Code Snippet, add-in scritto dall’MVP Alessandro Del Sole, consente di esportare facilmente blocchi di codice nel formato .snippet, e quindi riutilizzarli come Snippet Code direttamente attraverso la funzionalità presente nell’IDE

Code Style Enforcer. Questo add-in permette di ottenere segnalazioni evidenti nel proprio codice nel caso in cui siano violate regole di naming e di best practices (visibilità membri e interfacce esplicite o no), configurabili mediante file XML;

OxyProjectMetrics, estrae informazioni inerenti la metrica del codice e le mostra in un formato tabellare;

ResourceRefactor, estrae la stringa selezionata e cablata nel codice sorgente e la invia ad un apposito file di risorse;

AutoCode, add-in per automatizzare attività ripetitive di scrittura di codice mediante la creazione di comandi parametrici, come da esempio sotto.  

TytanNET, insieme di utili tool windows che incrementano le possibilità di refactoring del codice, e forniscono ulteriori visualizers per il debugging. Decisamente molto utile.

Su Visual Studio Gallery sono presenti decine e decine di altr utili add-in, sia gratuiti che non, per tutte le esigenze.

refactoring del codice

Mi appunto questo post molto interessante di Luca Minudel a proposito della attività di refactoring sul codice sorgente, molto spesso sottovalutata o ignorata del tutto in progetti reali.

Minudel elenca le seguenti 6 attività di refactoring che ritengo personalmente indispensabili ed utili.

* Estrae codice dai metodi troppo lunghi (>> 30 linee di codice)
* Cerca i commenti e modifica il codice in modo che si spieghi da solo
* Scorre i nomi di metodi e variabili e rinomina quelli poco chiari e quelli  poco descrittivi
* Guarda i blocchi condizionali (If, switch, for, …) e vede se li può eliminare
* Trova parti di codice duplicate e le elimina
* Scopre cosa fa ogni metodo e si chiede se si trova sulla classe giusta Inizia ogni punto mostrando come fare e quindi lascia continuare al suo collega, interviene quando serve

Impostare il calendarextender ad una cultura specifica

L’extender CalendarExtender presente nell’Ajax Toolkit presenta un bug se si cerca di globalizzarlo, ovvero adattarlo ad una specifica cultura. Infatti, la label presente in basso con l’indicazione della data odierna non viene globalizzata ma rimane impostata fissa alla cultura inglese, per cui apparirà sempre la scritta “Today”. Affinchè i controlli dell’Ajax Toolkit possano essere personalizzati sulla base delle varie culture non basta impostare la specifica cultura nel file di configurazione dell’applicazione web (tag globalization), oppure impostarla tramite browser, ma occorre anche abilitare il rendering dello script al supporto di culture specifiche, tramite la proprietà EnableScriptGlobalization dello ScriptManager, che deve essere ovviamente impostata a True (il valore di default è False).

Rilevare codice duplicato

Clone Detective for Visual Studio è una integrazione dell’ambiente Visual Studio (completamente free) in gradi di rilevare porzioni di codice duplicato tra i vari progetti che compongono una solution. Il fine è ambizioso, poichè come dice la stessa presentazione del prodotto presente su CodePlex

“Having duplicates can easily lead to inconsistencies and often is an indicator for poorly factored code”

Un componente del genere può davvero essere utilissimo, anche oltre lo scopo che si prefigge. Ad esempio, conoscendo accuratamente il numero di cloni presenti all’interno di un software con parecchie linee di codice, è possibile valutarne il costo di manutenzione, ovvero il costo a cui si va incontro se si decidesse di apportarvi delle modifiche.

Il componente si basa su ConQAT (Continuous Quality Assessment Toolkit) per rilevare le parti di codice duplicato. Questo toolkit fornisce una serie di tools e linee guida per il controllo della qualità del software

Visualcv, un ottimo sito per cv online

Mi appunto questo ottimo sito per uso futuro: VisualCv.

Consente di inserire il proprio cv online ed arricchirlo di contenuti multimediali: immagini, audio, video, grafici. Inoltre consente di pubblicarlo nel rispetto della politica di privacy scelta, di inviarlo via mail, di convertirlo automaticamente in formato PDF, di ottenere una URL unica da inviare a chi può essere interessato alla sua visualizzazione. Sul sito sono presenti diversi esempi di cv, fatti davvero bene e con un alto indice di usabilità. Se si aggiunge che il tutto è pure gratuito…

Invocazione di store procedure oracle in .NET

Il Data Access Application Block, contenuto all’interno della Enterprise Library 4.1 consente di richiamare store procedures passando esclusivamente il valore dei singoli parametri richiesti (mediante l’utilizzo del metodo GetStorepProcCommand dell’oggetto DatabaseFactory), nello stesso ordine con cui questi sono espressi nella firma della procedura. Poichè ADO .NET richiede comunque che ogni informazione in merito ai parametri della store sia obbligatoria (quindi tipo di dato, dimensione, precisione, scala, ecc), il metodo effettua internamente una chiamata al metodo DeriveParameters di ADO .NET che, attraverso un round-trip al database server, consente di recuperare tutte le informazioni necessarie sui parametri. Poichè come detto, questa chiamata richiede un round-trip verso il server, il data access application block fornisce anche un meccanismo di caching delle informazioni sui parametri recuperate dal server.

Oracle e SqServer hanno un meccanismo differente circa il ritorno di un resultset da una store procedure. Oracle infatti richiede, a differenza di Sql Server, l’utilizzo di un cursore come parametro di output per recuperare il resultset derivante da procedure che lo ritornano, fornendo anche un tipo speciale di dato, cursor appunto, nel suo provider nativo per .NET.

Se si usa il Data Access Application Block per invocare store procedure Oracle che ritornano un resultset attraverso l’uso di un cursore come parametro di output, non è necessario indicare quest’ultimo tra i parametri (anche perchè, pur provando ad indicarlo esplicitamente, non si troverebbe il tipo di dati cursor disponibile tra i tipi di dati in quanto viene usato l’enum System.Data.DbType che rappresenta genericamente i tpi di dati  per qualsiasi .NET Data Provider).

Basta infatti passare un generico parametro di output avente il valore null come primo parametro della store procedure Oracle e l’oggetto OracleDatabase farà il lavoro per noi. Questo oggetto infatti assume che il primo parametro di una store procedure sia un cursore di output per la restituzione del resultset

HttpResponse.ApplyAppPathModifier

Se si usano le sessioni ASP .NET coockieless, ovvero sessioni in cui il SessionID viene inserito nell’url nella seguente forma:

/App/(S(avsbnbml2n1n5mi5rmfqnu65))/default.aspx

il metodo ApplyAppPathModifier della classe HttpResponse risulta estremamente utile, poichè, passandogli come parametro stringa un path virtuale, restituisce lo stesso path con il SessiondID inserito correttamente nell’url, sollevando lo sviluppatore dalla costruzione manuale dello stesso. Ciò risulta evidente ogni qual volta è necessario utilizzare url caricati dinamicamente.

Metodi virtuali nel costruttore

Tra le guidelines da seguire circa la scrittura del costruttore di una classe questa assume una certa importanza:

Evitare di richiamare all’interno di un costruttore un metodo virtuale.

Questa guidelines è dovuta al fatto che in presenza di un metodo che ridefinisce un metodo virtuale (ne fa l’override insomma), viene richiamato sempre il metodo esposto dalla classe derivata, ovvero il metodo più specifico della implementazione, a prescindere se il costruttore della classe che espone il metodo derivato sia stato richiamato.  L’esempio sotto, tratto dalla documentazione MSDN, chiarisce bene questo concetto.

La creazione della classe DerivedFromBad, cioè il richiamo del suo costruttore, provoca la chiamata immediata  al costruttore della sua classe di base, ovvero BadBaseClass, il quale prima inizializza una variabile (state) e poi richiama il metodo virtuale SetState. Peccato che poiche l’oggetto che si sta cercando di costruire (DerivedFromBad) ridefinisce il metodo SetState, all’interno del costruttore della classe BaseClass il metodo effettivamente chiamato è l’implementazione fornita dalla classe DerivedFromBad, e non quella della classe base BadBaseClass. L’esecuzione  del metodo ridefinito SetState avviene a prescindere se il costruttore della classe derivata sia o no stato richiamato. In questo caso, poiche non  viene richiamato, l’inizializzazione della variabile state non  avviene ed il suo contenuto resta fermo a quello impostato dalla classe base, ovvero “BadBaseClass“.

 public class tester
 {
     public static void Main()
     {
         DerivedFromBad b = new DerivedFromBad();
     }
 }
      
 public class BadBaseClass
 {
      protected string state;
      public BadBaseClass()
      {
          state = "BadBaseClass";
          SetState();
      }
      public virtual void SetState()
      {
 
      }
 }
   
 public class DerivedFromBad : BadBaseClass
 {
      public DerivedFromBad()
      {
        state = "DerivedFromBad ";
      }
      public override void SetState()
      {
        Console.WriteLine(state);
      }
 }  

Snippet Code

Gli Snippet Code possono davvero far risparmiare tempo di sviluppo, soprattutto su operazioni ripetitive. Visual Studio, come è noto, fornisce un add-in per la gestione degli stessi su PC, e codificati in un file xml. Chi come me non usa sempre lo stesso PC per lavorare è costretto a sincronizzare gli snippet code su tutti i PC su cui sviluppa, operazione molto noiosa e anche molto soggetta ad errori. Sarebbe comodo in questi casi non avere il repository in  locale, ma averli centralizzati all’esterno.

<Code:Keep> fornisce appunto uno storage centralizzato  da cui attingere snippet code suddivisi per categoria ed in cui inserire i propri, ovviamente rendendoli usufruibili anche agli altri visitatori del sito, previa registrazione. Inoltre, viene messo a disposizione il download di un add-in per Visual Studio 2008, ovviamente gratuito, che permette di consultare ed utilizzare gli Snippet Code presenti nel sito direttamente dall’IDE, senza neanche aprire il browser.

Visual Studio 2008 Tip #1

In Visual Studio 2008 la pressione del tasto F12 rappresenta la scorciatoia da tastiera del comando Edit.GoToDefinition, che, come è noto, permette di “saltare” direttamente alla dichiarazione del simbolo selezionato nel codice. Non è però cosi evidente che il simbolo selezionato potrebbe anche risiedere nella pagina aspx. Ad esempio, se selezioniamo la classe CSS associata ad un controllo in una pagina aspx, o se semplicemente posizioniamo il puntatore del mouse all’interno della stringa della classe CSS, alla pressione del tasto F12 verrà automaticamente  aperto il file CSS contentente la definizione del simbolo selezionato e verrà interamente evidenziata la classe stessa con tutti gli attributi grafici associati,

Decisamente molto utile!