<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Technology's passion reborn</title>
	<atom:link href="http://msolcia.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://msolcia.wordpress.com</link>
	<description>Just another WordPress.com weblog</description>
	<lastBuildDate>Thu, 04 Jun 2009 16:07:28 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>it</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='msolcia.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/70b0e89f9774eb856f82b35f30e05830?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Technology's passion reborn</title>
		<link>http://msolcia.wordpress.com</link>
	</image>
			<item>
		<title>Input/Output: Streams (Exam 70-536)</title>
		<link>http://msolcia.wordpress.com/2009/06/04/inputoutput-streams-exam-70-536/</link>
		<comments>http://msolcia.wordpress.com/2009/06/04/inputoutput-streams-exam-70-536/#comments</comments>
		<pubDate>Thu, 04 Jun 2009 16:07:28 +0000</pubDate>
		<dc:creator>msolcia</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Certification]]></category>
		<category><![CDATA[Exam 70-536]]></category>

		<guid isPermaLink="false">http://msolcia.wordpress.com/2009/06/04/inputoutput-streams-exam-70-536/</guid>
		<description><![CDATA[Cosa sono gli Streams? Non sono altro che sequenze di dati che possono essere accedute (lette/scritte) sequenzialmente o in maniera random. 
Vi sono vari tipi di stream e cioè:
- FileStream (System.IO),
- MemoryStream (System.IO),
- CryptoStream (System.Security),
- NetworkStream (System.Net),
- GZipStream (System.Compression),
Tutti questi tipi di stream derivano dalla classe base astratta Stream che ha le seguenti proprietà:
- CanRead/CanSeek/CanTimeout/CanWrite: [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=63&subd=msolcia&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Cosa sono gli Streams? Non sono altro che sequenze di dati che possono essere accedute (lette/scritte) sequenzialmente o in maniera random. </p>
<p>Vi sono vari tipi di stream e cioè:</p>
<p><strong>- FileStream (System.IO),</strong></p>
<p><strong>- MemoryStream (System.IO),</strong></p>
<p><strong>- CryptoStream (System.Security),</strong></p>
<p><strong>- NetworkStream (System.Net),</strong></p>
<p><strong>- GZipStream (System.Compression),</strong></p>
<p>Tutti questi tipi di stream derivano dalla classe base astratta <strong>Stream</strong> che ha le seguenti proprietà:</p>
<p>- CanRead/CanSeek/CanTimeout/CanWrite: flag in lettura che indicano se lo stream: supporta la lettura/supporta il posizionamento/può andare in timeout/supporta la scrittura</p>
<p>- Length: ritorna la lunghezza in byte dello stream,</p>
<p>- Position: consente di leggere/impostare la posizione corrente sullo stream. [Position =&lt; Length]</p>
<p>A livello di operazioni:</p>
<p>- Close: chiude lo stream e libera qualsiasi risorsa associata ad esso,</p>
<p>- Read/ReadByte: legge un numero di byte dallo stream partendo dalla posizione corrente, aggiornando la posizione corrente,</p>
<p>- Write/WriteByte: scrive sullo stream partendo dalla posizione corrrente, aggiornando la posizione corrente</p>
<p>- Seek: imposta la posizione corrente all’interno dello Stream</p>
<p>- Flush: garantisce che tutti i dati presenti nei buffer in memoria sia effettivamente scritti sullo stream.</p>
<p>Iniziando a parlare dei FileStream, introduciamo la classe statica <strong>File</strong> la quale permette di creare e aprire i files per leggere e scrivere. Considerando le operazioni sui file, la classe File è identica a FileInfo (descritta nel precedente post). Questa classe ritorna oggetti di tipo FileStream (una classe che rappresenta un file all’interno del file system) o StreamReader e StreamWriter (classi che wrappano FileStream e consentono operazioni di lettura e scrittura sequenziali). I principali membri:</p>
<p>- AppendText: Apre un file (o lo crea se non esiste) e ritorna uno StreamWriter</p>
<p>- Create/Open: Crea/Apre un file e ritorna un FileStream,</p>
<p>- OpenText: apre un file e ritorna StreamReader</p>
<p>- ReadAllBytes/ReadAllLines/ReadAllText: apre un file, legge il contenuto in un array di bytes/array di string/string e chiude il file in una operazione atomica,</p>
<p>- WriteAllBytes/WriteAllLines/WriteAllText: sono la controparte dei metodi riportati sopra per la scrittura. </p>
<p>Analogamente alla classe File vi è la classe statica <strong>Directory</strong> che presenta una serie di metodi statici per manipolare e creare le directories, ad esempio:</p>
<p>- CreateDirectory/Delete: crea/cancella directory in un path specificato,</p>
<p>- Exists: determina se una directory esiste o meno,</p>
<p>- GetCurrentDirectory/SetCurrentDirectory: ritorna/imposta un oggetto di tipo DirectoryInfo relativo alla directory corrente,</p>
<p>- GetFiles: ritorna i nomi dei file in una directory,</p>
<p>- GetLogicalDrives: ritorna una lista dei drives del sistema (e.g. “c:\”)</p>
<p>Con i metodi di gestione dei file visti sopra, vengono usati due enumerativi:</p>
<p><strong>FileAccess</strong> che specifica i diritti richiesti durante l’apertura di un file (Read, Write, ReadWrite) e <strong>FileMode</strong> che specifica come un file debba essere creato/aperto (Append, Create, CreateNew, Open, OpenOrCreate, Truncate).</p>
<p>Come già accennato le funzionalità base per aprire un file streams e leggere/scrivere il contenuto sono date dalla classe <strong>FileStream </strong>la quale dispone dei seguenti proprietà:</p>
<p>- Handle: file handle,</p>
<p>- Name: nome del file,</p>
<p>- più tutte quelle derivate dalla classe base astratta Streams e viste sopra.</p>
<p>e i seguenti metodi:</p>
<p>- Lock/Unlock: mantiene/libera un lock sullo stream in modo che nessun altro processo possa alterarlo,</p>
<p>- più tutti i metodi derivate dalla classe base astratta Streams.</p>
<p>Per facilitare la lettura e la scrittura sequenziale, il framework .NET metta a disposizione due classi StreamReader e StreamWriter.</p>
<p><strong>StreamReader</strong> consente di leggere dati come stringhe da una qualsiasi classe derivata da Stream. </p>
<p>Proprietà:</p>
<p>- BaseStream: ritorna lo stream che StreamReader sta leggendo,</p>
<p>- CurrentEncoding: ritorna il tipo di encoding dello stream BaseStream,</p>
<p>- EndOfStream: indica se si è raggiunti la fine dello stream BaseStream.</p>
<p>Metodi:</p>
<p>- Close: chiude lo stream</p>
<p>- Peek: recupera il successivo (rispetto alla posizione corrente) carattere,</p>
<p>- Read/ReadBlock/ReadLine/ReadToEnd: legge i successivi caratteri per insieme/blocco/linea/sino alla fine.</p>
<p>Analogamente StreamWriter consente di scrivere dati di tipo stringa su una qualsiasi classe derivata da Stream.</p>
<p>Proprietà:</p>
<p>- AutoFlush: legge o imposta l’autoflush ad ogni chiamata al metodo Write.</p>
<p>- BaseStream: ritorna lo stream che StreamWriter sta scrivendo,</p>
<p>- NewLine: imposta il carattere di nuova riga,</p>
<p>Metodi:</p>
<p>- Close: chiude lo stream BaseStream</p>
<p>- Write/WriteLine: scrive sullo stream/scrive sullo stream includendo il carattere di NewLine</p>
<p>StreamReader e StreamWriter derivano rispettivamente dalle classi astratte <strong>TextReader e TextWriter</strong> le quali rappresentano l’interfaccia per leggere e scrivere dati basati su testo.</p>
<p>Analogamente esistono anche le classi per leggere/scrivere dati binari <strong>BinaryReader e BinaryWriter.</strong></p>
<p>Tornando ai vari tipi di stream parliamo ora della classe <strong>MemoryStream </strong>la quale fornisce le funzionalità per creare degli stream in memoria.</p>
<p>Oltre alle proprietà della classe base abbiamo:</p>
<p>- Capacity: legge o setta il numero di bytes allocati per uno stream,</p>
<p>Come metodi:</p>
<p>- GetBuffer: ritorna un array di unsigned bytes usato per creare lo stream,</p>
<p>- ToArray: scrive l’intero stream su un array di bytes.</p>
<p>- WriteTo: scrive il MemoryStream su un altro stream.</p>
<p>I MemoryStream sono utili per lavorare con i dati in memoria e poi consolidarli ad esempio su disco. Per farlo si può usare la seguente procedura:</p>
<p>1) Creazione del MemoryStream,</p>
<p>2) Creazione del StreamWriter associato al MemoryStream,</p>
<p>3) Creazione di un FileStream</p>
<p>4) Uso del metodo WriteTo dello StreamWriter per scrivere sullo FileStream.</p>
<p>Un altro modo per migliorare le performance delle letture e scritture sugli stream e bufferizzarle. A questo scopo si può usare la classe <strong>BufferedStream </strong>che ingloba lo Stream da cui leggere/scrivere e interpone un buffer invece di leggere/scrivere ogni volta dallo Stream. Ad esempio supponendo di voler scrivere su un file, si può usare la seguente procedura:</p>
<p>1) Si crea un oggetto FileStream associato ad un nuovo file,</p>
<p>2) Si crea un oggetto BufferedStream specificando il FileStream,</p>
<p>3) Si usa uno StreamWriter per scrivere dati sul BufferedStream.</p>
<p>Concludiamo questa panoramica sugli stream con le classi <strong>GZipStream e DeflateStream:</strong> entrambe si occupano di comprimere o decomprimere sequenze di dati sino a 4Gb di dimensione (GZipStream usa un formato portabile dunque da preferirsi se lo stream generato viene poi inviato ad altre piattaforme). </p>
<p>Le proprietà/metodi di <strong>GZipStream/DeflateStream</strong> sono tutti ereditati da Stream a parte:</p>
<p>- BaseStream: ritorna lo Stream su cui la classe lavora,</p>
<p>Un’importante differenza rispetto alle altre classi è che GZipStream/DeflateStream ricevono in input uno stream e producono in output un altro stream. </p>
<p>Vediamo come utilizzare queste classi per comprimere:</p>
<p>1) Si apre in lettura lo stream del file sorgente da comprimere,</p>
<p>2) Si apre in scrittura il file destinazione</p>
<p>3) Si crea un oggetto di classe GZipStream/DeflateStream passando nel costruttore lo stream destinazione e specificando CompressionMode.Compress</p>
<p>4) Si leggono i dati dal file sorgente e li si inseriscono nel oggetto GZipStream/DeflateStream</p>
<p>La procedura per decomprimere è un po’ diversa:</p>
<p>1) Si crea un oggetto di classe GZipStream/DeflateStream passando nel costruttore lo stream sorgente (quello compresso) e specificando CompressionMode.Compress,</p>
<p>2) si apre in scrittura il file di destinazione,</p>
<p>3) leggendo dal oggetto GZipStream/DeflateStream si scrive sullo Stream di destinazione.</p>
<p>Nel prossimo post parliamo di Isolated Storage.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msolcia.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msolcia.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msolcia.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msolcia.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msolcia.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msolcia.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msolcia.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msolcia.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msolcia.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msolcia.wordpress.com/63/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=63&subd=msolcia&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://msolcia.wordpress.com/2009/06/04/inputoutput-streams-exam-70-536/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e0051e740b1ca91d27a7475b01f0a38b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">msolcia</media:title>
		</media:content>
	</item>
		<item>
		<title>Problemi con RunAs? usa il secondary access service</title>
		<link>http://msolcia.wordpress.com/2009/03/27/problemi-con-runas-usa-il-secondary-access-service/</link>
		<comments>http://msolcia.wordpress.com/2009/03/27/problemi-con-runas-usa-il-secondary-access-service/#comments</comments>
		<pubDate>Fri, 27 Mar 2009 10:35:58 +0000</pubDate>
		<dc:creator>msolcia</dc:creator>
				<category><![CDATA[Tricks & Tips]]></category>

		<guid isPermaLink="false">http://msolcia.wordpress.com/2009/03/27/problemi-con-runas-usa-il-secondary-access-service/</guid>
		<description><![CDATA[“RunAs”, il comando che serve a lanciare gli exe facendo finta di essere un altro utente, mi ha sempre dato problemi. Ultimamente quando cercavo di farlo da UI (cliccando il tasto destro sul exe), mi dava il seguente messaggio:
“the parameter is incorrect”
oggi ho provato a documentarmi meglio. 
Avevo bisogno di lanciare Excel impersonificandomi con un [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=61&subd=msolcia&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>“RunAs”, il comando che serve a lanciare gli exe facendo finta di essere un altro utente, mi ha sempre dato problemi. Ultimamente quando cercavo di farlo da UI (cliccando il tasto destro sul exe), mi dava il seguente messaggio:</p>
<p>“the parameter is incorrect”</p>
<p>oggi ho provato a documentarmi meglio. </p>
<p>Avevo bisogno di lanciare Excel impersonificandomi con un altro utente per alcuni test che sto conducendo sul nostro Add-in. Leggendo qualche post in rete ho scoperto che qualcuno aveva risolto usando il comando a riga di comando e posizionandosi direttamente nella directory dell’applicativo da lanciare, nel mio caso “C:\Program Files\MicrosoftOffice\Office12”.</p>
<p>Ho quindi provato con:</p>
<p>runas /env /user:utente_dominio excel</p>
<p>alla richiesta della password mi ha dato un errore diverso e cioé:</p>
<p>1058: The service cannot be started, either because it is disabled or because it has no enabled devices associated with it</p>
<p>Una rapida googlata e ho scoperto che andava lanciato il servizio “Secondary Access”. </p>
<p>Ora “RunAs” ha ripreso a funzionare.</p>
<p>Lascio questo post sperando di essere utile a qualcuno: del resto la soluzione era veramente semplice.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msolcia.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msolcia.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msolcia.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msolcia.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msolcia.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msolcia.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msolcia.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msolcia.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msolcia.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msolcia.wordpress.com/61/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=61&subd=msolcia&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://msolcia.wordpress.com/2009/03/27/problemi-con-runas-usa-il-secondary-access-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e0051e740b1ca91d27a7475b01f0a38b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">msolcia</media:title>
		</media:content>
	</item>
		<item>
		<title>Refactoring e cattivi odori nel codice (code smells)</title>
		<link>http://msolcia.wordpress.com/2009/03/05/refactoring-e-cattivi-odori-nel-codice-code-smells/</link>
		<comments>http://msolcia.wordpress.com/2009/03/05/refactoring-e-cattivi-odori-nel-codice-code-smells/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 22:51:40 +0000</pubDate>
		<dc:creator>msolcia</dc:creator>
				<category><![CDATA[Agile Methodology]]></category>
		<category><![CDATA[Books]]></category>
		<category><![CDATA[Refactoring]]></category>

		<guid isPermaLink="false">http://msolcia.wordpress.com/2009/03/05/refactoring-e-cattivi-odori-nel-codice-code-smells/</guid>
		<description><![CDATA[Tanto per cambiare ho iniziato un nuovo libro “Refactoring Workbook” . Userò il blog come una sorta di block notes per prendere qualche appunto sul argomento.
Cos’è il refactoring? 
E’ l’arte di migliorare il design del codice esistente e funzionante. 
Cosa non è considerato refactoring?
1) Aggiungere funzionalità; sebbene il refactoring possa far parte di alcune tecniche [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=60&subd=msolcia&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Tanto per cambiare ho iniziato un nuovo libro “<a href="http://www.amazon.com/exec/obidos/ASIN/0321109295/xp123com">Refactoring Workbook</a>” . Userò il blog come una sorta di block notes per prendere qualche appunto sul argomento.</p>
<p><strong>Cos’è il refactoring?</strong> </p>
<p>E’ l’arte di migliorare il design del codice esistente e funzionante. </p>
<p><strong>Cosa non è considerato refactoring?</strong></p>
<p>1) Aggiungere funzionalità; sebbene il refactoring possa far parte di alcune tecniche come il TDD che lo usano per aggiungere nuove funzionalità, esso non ha come fine la creazione di nuove funzionalità,</p>
<p>2) Riscrivere il codice dall’inizio. Il Refactoring preferisce bilanciare meglio il codice già esistente senza prendersi il rischio di riscrivere codice nuovo potenzialmente non funzionante.</p>
<p>3) Un completo stravolgimento del codice che lo mantiene “non funzionante” oltre una normale sessione di lavoro. Il refactoring viene fatto a piccoli step alla volta, step magari molto frequenti ma che mantengono sempre funzionante il codice risultante.</p>
<p>Se pensiamo che vi sono due tipi di design: l’up-front design, cioè il design che viene deciso ancor prima di scrivere il codice e l’emerging design che è intrinsecamente connesso al codice che scriviamo, il refactoring cerca di abbassare il rischio ed il costo di quest’ultimo.</p>
<p><strong>La metafora dei cattivi odori nel codice (code smells)</strong></p>
<p>Nella vita quotidiana un cattivo odore richiama la nostra attenzione. La causa del cattivo odore può essere un problema oppure una cosa normale. L’intensità stessa dell’odore in alcuni casi ci da la certezza del problema, in altri casi no. Alcuni odori coprono altri odori, alcuni odori se ne vanno risolvendo altri problemi non direttamente collegati. Per ogni smell è importante <strong>saper riconoscere i sintomi, le cause, saper cosa fare, payoff e conoscere le controindicazioni</strong> (cioè in alcuni casi la medicina potrebbe uccidere il paziente <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' />  ).</p>
<p>Il code smell dunque descrive un problema localizzato nel codice e come tale non vi è garanzia, una volta fissato quel problema, di aver risolto completamente. Per questo motivo il fixing di uno smell viene fatto in maniera iterativa/incrementale con il seguente ciclo (loop):</p>
<p><strong>Il ciclo di refactoring</strong></p>
<p>1) si considera un programma funzionante,</p>
<p>2) Finché vi è puzza di codice marcio <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>2.a) Si sceglie il codice con il puzzo peggiore,</p>
<p>2.b) Si seleziona la tecnica di refactoring appropriata e la si usa</p>
<p>3) Si ritorna al punto 2.</p>
<p>La difficoltà di questo processo è quella di riconoscere gli smells nonché riuscire a classificarli in base alla gravità (punto due).</p>
<p>Come approccio si può iniziare a fattorizzare le cose più macroscopiche (es. rinominare variabili/metodi con nomi più chiari o dividere i metodi che hanno più di 30 righe di codice in sotto-metodi).</p>
<p><strong>Sempre il punto due dice “finché”, ma come si capisce che si è finito?</strong></p>
<p>Kent Beck utilizza il concetto di Simple Design: se il codice non rispetta le 4 regole seguenti vi è un problema di sistemare. Il design è semplice quando il codice:</p>
<p>1) Passa tutti i test,</p>
<p>2) Non ha al suo interno logica duplicata,</p>
<p>3) Fa capire chiaramente il proprio intento a chi legge il codice,</p>
<p>4) Ha il minor numero di classi e metodi</p>
<p><strong>Il simple design va constantemente mantenuto.</strong> Proprio in questi giorni sto rifattorizzando una serie di classi del nostro prodotto che sono state lasciate crescere a dismisura (metodi di 100+ righe) e la fatica che sto facendo per rifattorizzare tutto, sarebbe stata sicuramente minore se l’avessi fatta man mano che il codice cresceva.</p>
<p><strong>Dove si situa il refactoring all’interno dei metodi di sviluppo agile?</strong></p>
<p>Il refactoring è una tecnica che vive di vita propria, nel senso non è necessario imparare metodi di sviluppo agile per poterla usare. Nonostante questo ad esempio l’eXtreme Programming con il test-driven development (TDD) ne fa uno dei sue tre pilastri (insieme a Simple Design e test-first programming). In questi casi codice creato usando TDD richiede minor attività di refactoring.</p>
<p><strong>Come si pratica il refactoring?</strong></p>
<p><strong>Strumenti: </strong>è sufficiente un editor di testi, anche oggi giorno ci si può avvalere di strumenti più sofisticati come l’editor di Visual Studio (o tool come Resharper) che consentono di automatizzare alcuni tipi di refactoring.</p>
<p><strong>Persone:</strong> è meglio praticare il refactoring in team (o in coppia). In questo modo le diverse esperienze delle persone del team consentono di generare molte più idee/soluzioni rispetto al singolo.</p>
<p><strong>Tests:</strong> una suite di test è indispensabile per avere una rete di salvataggio nel caso alcune modifiche cambino il design del software. Sul mercato vi sono numerosi framework che aiutano a costruire i test.</p>
<p><strong>UML, CRC: </strong>il refactoring non sostituisce il design up-front</p>
<p><strong>Configuration management/Version Control:</strong> questi strumenti sono importanti per poter confrontare le diverse versioni del codice dopo i diversi passi di refactoring. Grazie ad essi è anche possibile effettuare degli undo dei refactoring che hanno erroneamente cambiato il design o eseguire un refactoring con modalità trying&amp;error.</p>
<p>Bene questa la teoria, ora non rimane che fare un po’ di pratica.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msolcia.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msolcia.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msolcia.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msolcia.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msolcia.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msolcia.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msolcia.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msolcia.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msolcia.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msolcia.wordpress.com/60/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=60&subd=msolcia&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://msolcia.wordpress.com/2009/03/05/refactoring-e-cattivi-odori-nel-codice-code-smells/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e0051e740b1ca91d27a7475b01f0a38b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">msolcia</media:title>
		</media:content>
	</item>
		<item>
		<title>Input/Output: manipolare gli oggetti del file system (Esame 70-536)</title>
		<link>http://msolcia.wordpress.com/2009/02/11/inputoutput-manipolare-gli-oggetti-del-file-system-exam-70-536/</link>
		<comments>http://msolcia.wordpress.com/2009/02/11/inputoutput-manipolare-gli-oggetti-del-file-system-exam-70-536/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 13:06:27 +0000</pubDate>
		<dc:creator>msolcia</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Certification]]></category>
		<category><![CDATA[Exam 70-536]]></category>

		<guid isPermaLink="false">http://msolcia.wordpress.com/2009/02/11/inputoutput-manipolare-gli-oggetti-del-file-system-exam-70-536/</guid>
		<description><![CDATA[Il capitolo I/O si articola in 5 temi che vedrò di trattare in post specifici:
1) Classi per la gestione/navigazione del file system,
2) Classi per la gestione di flussi (stream) di byte,
3) Classi per leggere e scrivere dati dalle applicazioni .NET,
4) Classi per comprimere streams,
5) Isolated storage,
Le classi per la gestione del file system si trovano [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=58&subd=msolcia&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Il capitolo I/O si articola in 5 temi che vedrò di trattare in post specifici:</p>
<p>1) Classi per la gestione/navigazione del file system,</p>
<p>2) Classi per la gestione di flussi (stream) di byte,</p>
<p>3) Classi per leggere e scrivere dati dalle applicazioni .NET,</p>
<p>4) Classi per comprimere streams,</p>
<p>5) Isolated storage,</p>
<p>Le classi per la gestione del file system si trovano nel namespace System.IO, esse si dividono in classi informative e di utilità.</p>
<p>La maggior parte delle classi informative derivano da <strong>FileSystemInfo</strong> (FileInfo, DirectoryInfo) che contiene metodi e proprietà tramite le quali è possibile: sapere se un file o directory esiste, conoscere l’estensione, conoscere gli attributi (read only, archive, ecc), conoscere le date dell’ultimo accesso.</p>
<p>La classe <strong>FileInfo</strong> ha i seguenti membri (elenco i principali):</p>
<p>- Directory: ottenere l’oggetto di tipo DirectoryInfo che rappresenta la directory che contiene il file,</p>
<p>- Length: La lunghezza del file,</p>
<p>- IsReadOnly: se il file è in readonly,</p>
<p>- CreateText/OpenText/AppendText: crea/apre/aggiunge testo al file usando uno StreamWriter,</p>
<p>- CopyTo/MoveTo: copia/muove il file in una nuova locazione,</p>
<p>- Create/Open/OpenWrite/OpenRead: crea/apre/”apre in scrittura”/”apre in sola lettura” un file,</p>
<p>- Decrypt/Encrypt: beh si capisce <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>- Replace: sostituisce un file con le info presenti nell’oggetto FileInfo corrente,</p>
<p>La classe <strong>DirectoryInfo </strong>manipola e gestisce le diretory, i suoi membri sono:</p>
<p>- Parent/Root: per conoscere la directory padre/root,</p>
<p>- Create/CreateSubdirectiry: per creare una directory/sottodirectory</p>
<p>- GetDirectories/GetFiles: restituisce un array di DirectoryInfo/FileInfo che rappresenta le sottodirectory/files del DirectoryInfo corrente,</p>
<p>- GetFileSystemInfos: è simile ai metodi GetDirectory/GetFiles ma restituisce un array di FileSystemInfo che contiene entrambi files e directory contenuti dal DirectoryInfo corrente,</p>
<p>- MoveTo: per spostare tutto il contenuto di una directory</p>
<p>Il seguente frammento di codice enumera tutti i files contenuti nella directory “D:\Test”.</p>
<div style="font-family:consolas;background:#222215;color:#dfdfbf;font-size:13pt;">
<p style="margin:0;"><span style="color:#e1795b;">DirectoryInfo</span> myDir = <span style="color:#cccc37;">new</span> <span style="color:#e1795b;">DirectoryInfo</span>(<span style="color:#a31515;">@&quot;D:\Test&quot;</span>);</p>
<p style="margin:0;">&#160;</p>
<p style="margin:0;"><span style="color:#e1795b;">FileInfo</span>[] files = myDir.GetFiles();</p>
<p style="margin:0;">&#160;</p>
<p style="margin:0;"><span style="color:#cccc37;">foreach</span> (<span style="color:#e1795b;">FileInfo</span> file <span style="color:#cccc37;">in</span> files)</p>
<p style="margin:0;">{</p>
<p style="margin:0;">&#160;&#160;&#160; <span style="color:#e1795b;">Console</span>.WriteLine(<span style="color:#c89191;">&quot;{0}&quot;</span>, file.Name);</p>
<p style="margin:0;">}</p>
</p></div>
<p>&#160;</p>
<p>Vi è poi la classe <strong>DriveInfo</strong> per accedere alle informazioni riguardanti i drives. I principali membri sono:</p>
<p>- AvailableFreeSpace/TotalFreeSpace/TotalSize: ritorna lo spazio disponibile tenendo conto della quota utente/spazio disponibile NON tenendo conto della quota utente/spazio totale.</p>
<p>- DriveFormat: Format del file system (NTFS, FAT, ecc);</p>
<p>- DriveType: Enumerativo DriveType (CDROM, Fixed, Network, NoRootDirectory, Ram, Removable, Unknown)</p>
<p>- RootDirectory: ritorna l’oggetto DirectoryInfo che rappresenta la directory root</p>
<p>- IsReady: importante questa proprietà soprattutto per i CD-ROM e le unità removibili; prima infatti di usare proprietà come DriveFormat, RootDirectory, ecc bisogna controllare che il drive sia pronto (Name e DriveFormat invece possono essere sempre lette).</p>
<p>Vi inoltre il metodo statico GetDrives() che ritorna un array DriveInfo di tutti i drives del sistema.</p>
<p>Continuiamo la carellata con la classe <strong>Path. </strong>Da notare che si tratta di una classe statica, dunque potremmo definirla come un insieme di metodi per manipolare i path (i percorsi: stringhe usate per indicare la posizione di file e directory all’interno del file system).</p>
<p>- ChangeExtension: dato un path viene ritornato un nuovo path con la nuova estensione di file indicata,</p>
<p>- Combine: combinazione di due path</p>
<p>- GetDirectoryName/GetFileName/GetFileNameWithoutExtension/</p>
<p>GetExtension/GetFullPath/GetPathRoot: il nome dei metodi è autoesplicativo</p>
<p>- GetRandomFileName: per generare un nome di file a caso (es. “y5pj1wjl.u40”). Di primo avviso l’ho pensato utile per i file temporanei ma forse meglio usare il metodo seguente.</p>
<p>- GetTempFileName: simile al precedente genera un path completo nella locazione “Local Settings” dell’utente (es. “C:\Documents and Settings\&lt;&lt;nome utente&gt;&gt;a\Local Settings\Temp\tmp38C.tmp”);</p>
<p>- GetTempPath: ritorna la posizione della directory temp per l’utente.</p>
<p>Per concludere la classe <strong>FileSystemWatcher </strong>con la quale è possibile monitorare i cambiamenti al file system.</p>
<p>- EnableRaisingEvents: consente di abilitare/disabilitare il “watching”,</p>
<p>- Filter: consente di impostare quali tipi di file devono essere monitorati (non impostanto niente, tutti i files vengono monitorati),</p>
<p>- IncludeSubdirectories: specifica se monitorare le subdirectory o solo la directory specificata nella proprietà Path,</p>
<p>- NotifyFilter: consente di specificare quale evento riportare (cancellazione, aggiunta, modifica, rinomina),</p>
<p>- Path: specifica quale directory monitorare,</p>
<p>- WaitForChanged: è un metodo che consente di monitorare la directory in maniera sincrona; una volta che l’esecuzione del metodo è finita, esso ritorna una struttura contenente i cambiamenti riscontrati.</p>
<p>Gli eventi riportati sono: </p>
<p>- Changed: directory o file modificati</p>
<p>- Created: directory o file creati</p>
<p>- Deleted: directory o file cancellati</p>
<p>- Renamed: directory o file rinominati</p>
<p>Questo un piccolo esempio che monitora il path C:\ e che riporta ogni file/directory creata e ogni file/directory rinominata.</p>
<div style="font-family:consolas;background:#222215;color:#dfdfbf;font-size:13pt;">
<p style="margin:0;"><span style="color:#cccc37;">class</span> <span style="color:#e1795b;">Program</span></p>
<p style="margin:0;">{</p>
<p style="margin:0;">&#160;&#160;&#160; <span style="color:#cccc37;">static</span> <span style="color:#cccc37;">void</span> Main(<span style="color:#cccc37;">string</span>[] args)</p>
<p style="margin:0;">&#160;&#160;&#160; {</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color:#e1795b;">FileSystemWatcher</span> fsWatcher = <span style="color:#cccc37;">new</span> <span style="color:#e1795b;">FileSystemWatcher</span>(<span style="color:#a31515;">@&quot;c:\&quot;</span>);</p>
<p style="margin:0;">&#160;</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; fsWatcher.Renamed += <span style="color:#cccc37;">new</span> <span style="color:#2b91af;">RenamedEventHandler</span>(fsWatcher_Renamed);</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; fsWatcher.Created += <span style="color:#cccc37;">new</span> <span style="color:#2b91af;">FileSystemEventHandler</span>(fsWatcher_Created);</p>
<p style="margin:0;">&#160;</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; fsWatcher.EnableRaisingEvents = <span style="color:#cccc37;">true</span>;</p>
<p style="margin:0;">&#160;</p>
<p style="margin:0;">&#160;</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color:#e1795b;">Console</span>.ReadLine();</p>
<p style="margin:0;">&#160;&#160;&#160; }</p>
<p style="margin:0;">&#160;</p>
<p style="margin:0;">&#160;&#160;&#160; <span style="color:#cccc37;">static</span> <span style="color:#cccc37;">void</span> fsWatcher_Renamed(<span style="color:#cccc37;">object</span> sender, <span style="color:#e1795b;">RenamedEventArgs</span> e)</p>
<p style="margin:0;">&#160;&#160;&#160; {</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color:#e1795b;">Console</span>.WriteLine(<span style="color:#c89191;">&quot;Renamed old name {0} to {1}&quot;</span>, e.OldName, e.FullPath);</p>
<p style="margin:0;">&#160;&#160;&#160; }</p>
<p style="margin:0;">&#160;</p>
<p style="margin:0;">&#160;&#160;&#160; <span style="color:#cccc37;">static</span> <span style="color:#cccc37;">void</span> fsWatcher_Created(<span style="color:#cccc37;">object</span> sender, <span style="color:#e1795b;">FileSystemEventArgs</span> e)</p>
<p style="margin:0;">&#160;&#160;&#160; {</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color:#e1795b;">Console</span>.WriteLine(<span style="color:#c89191;">&quot;Created {0}&quot;</span>, e.FullPath);</p>
<p style="margin:0;">&#160;&#160;&#160; }</p>
<p style="margin:0;">}</p>
</p></div>
<p>&#160;</p>
<p>Da notare che se il path non è corretto non viene riportato nessun errore e niente succede (io ad esempio invece di “C:\” avevo messo “C:”).</p>
<p>Nel prossimo post vedremo come trattare il contenuto dei files e i flussi dati in generale. A presto.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msolcia.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msolcia.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msolcia.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msolcia.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msolcia.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msolcia.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msolcia.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msolcia.wordpress.com/58/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msolcia.wordpress.com/58/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msolcia.wordpress.com/58/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=58&subd=msolcia&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://msolcia.wordpress.com/2009/02/11/inputoutput-manipolare-gli-oggetti-del-file-system-exam-70-536/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e0051e740b1ca91d27a7475b01f0a38b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">msolcia</media:title>
		</media:content>
	</item>
		<item>
		<title>Converting between types (Esame 70-536)</title>
		<link>http://msolcia.wordpress.com/2009/02/05/converting-between-types-esame-70-536/</link>
		<comments>http://msolcia.wordpress.com/2009/02/05/converting-between-types-esame-70-536/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 08:07:00 +0000</pubDate>
		<dc:creator>msolcia</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Certification]]></category>
		<category><![CDATA[Exam 70-536]]></category>

		<guid isPermaLink="false">http://msolcia.wordpress.com/2009/02/05/converting-between-types-esame-70-536/</guid>
		<description><![CDATA[Purtroppo i miei post riguardanti la preparazione per l’esame 70-536 si sono molto diradati, complice il crescente interesse sulla parte Unit Testing e Mocking che consuma la maggior parte del mio tempo, per non parlare del lavoro  . Ma non desisto, ho intenzione di prendere una certificazione Microsoft, anzi la butto lì….. voglio diventare [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=57&subd=msolcia&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Purtroppo i miei post riguardanti la preparazione per l’esame 70-536 si sono molto diradati, complice il crescente interesse sulla parte Unit Testing e Mocking che consuma la maggior parte del mio tempo, per non parlare del lavoro <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> . Ma non desisto, ho intenzione di prendere una certificazione Microsoft, anzi la butto lì….. voglio diventare MCT (di questo passo verso i 45 anni dovrei farcela <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> )</p>
<p>Parliamo di conversione tra i tipi. </p>
<p>Una conversione tra tipi può essere necessaria quando ad esempio si vogliono comparare due oggetti di tipo diverso. La conversione può essere:</p>
<p><strong>Conversione implicita:</strong> il sistema effettua la conversione “senza bisogno di aiuto”; questo tipo di conversione è possibile quando il tipo di destinazione può accomodare tutti i possibili valori del tipo sorgente (<strong>Widening conversion</strong>). Il C# proibisce la conversione implicita da un tipo ad un altro quando essa causa perdita di precisione (<strong>narrowing conversion</strong>). In questo caso è necessaria la conversione esplicita.</p>
<p><strong>Conversione esplicita:</strong> il sistema non è capace di effettuare la conversione e richiede che sia il programmatore a specificare la regola di conversione usando uno dei meccanismi seguenti:</p>
<p>- (type): il buon vecchio e caro cast è utilizzabile tra tipi che definiscono gli operatori di conversione specifici,</p>
<p>- System.Convert: consente la conversione tra tipi che implementano IConvertible,</p>
<p>- type.ToString: converte da tipo base a stringa (solleva eccezione se la conversione non è possibile),</p>
<p>- type.Parse: converte da stringa a tipo base (solleva eccezione se la conversione non è possibile), </p>
<p>- type.TryParse: come type.Parse converte da stringa a tipo base ma in questo caso se la conversione non è definita ritorna false,</p>
<p><strong></strong></p>
<p><strong>Boxing e Unboxing: </strong></p>
<p>Abbiamo già parlato di tipi Value e di tipi Reference. Il <strong>boxing</strong> non è altro che la conversione di un tipo Value in un tipo Reference (ad esempio la conversione di un int in un object). Tale conversione avviene anche quando si chiamano metodi virtuali di struct che derivano da System.Object.</p>
<p>L’unboxing è chiaramente l’operazione contraria.</p>
<p>Queste due operazioni se usate all’interno di cicli (loop) possono causare rallentamenti nelle performance. Ecco allora alcuni consigli per evitare il boxing/unboxing:</p>
<p>1) Usare i generics dove possibile invece di Object,</p>
<p>2) Fare l’override di ToString, Equals, GetHash per le strutture,</p>
<p>3) Per metodi che possono accettare diversi tipi value, fare sempre una versione del metodo specifica per il tipo (si legaal punto 1: evitare l’object).</p>
<p>Da ultimo vediamo quali tecniche si possono usare per <strong>implementare la conversioni tra tipi custom</strong> e tipi base:</p>
<p>A) Definire gli operatori di conversione, permette di specificare come convertire da tipo base a tipo custom e viceversa. </p>
<p><strong>implicit</strong> <strong>operator</strong> da usare per le conversioni Widening.</p>
<p>explicit <strong>operator </strong>da usare per le conversioni Narrowing.</p>
<div style="font-family:consolas;background:#222215;color:#dfdfbf;font-size:13pt;">
<p style="margin:0;"><span style="color:#cccc37;">namespace</span> ConsoleApplication1</p>
<p style="margin:0;">{</p>
<p style="margin:0;">&#160;&#160;&#160; <span style="color:#cccc37;">public</span> <span style="color:#cccc37;">struct</span> <span style="color:#2b91af;">MyType</span></p>
<p style="margin:0;">&#160;&#160;&#160; {</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; public <span style="color:#cccc37;">double</span> value;</p>
<p style="margin:0;">&#160;</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color:#cccc37;">public</span> <span style="color:#cccc37;">static</span> <span style="color:#cccc37;">implicit</span> <span style="color:#cccc37;">operator</span> <span style="color:#2b91af;">MyType</span> (<span style="color:#cccc37;">double</span> a)</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color:#2b91af;">MyType</span> b = <span style="color:#cccc37;">new</span> <span style="color:#2b91af;">MyType</span>();</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; b.value = a;</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color:#cccc37;">return</span> b;</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>
<p style="margin:0;">&#160;</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color:#cccc37;">public</span> <span style="color:#cccc37;">static</span> <span style="color:#cccc37;">explicit</span> <span style="color:#cccc37;">operator</span> <span style="color:#cccc37;">int</span> (<span style="color:#2b91af;">MyType</span> a)</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color:#cccc37;">return</span> (<span style="color:#cccc37;">int</span>) a.value;</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>
<p style="margin:0;">&#160;&#160;&#160; }</p>
<p style="margin:0;">&#160;</p>
<p style="margin:0;">&#160;&#160;&#160; <span style="color:#cccc37;">class</span> <span style="color:#e1795b;">Program</span></p>
<p style="margin:0;">&#160;&#160;&#160; {</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color:#cccc37;">static</span> <span style="color:#cccc37;">void</span> Main(<span style="color:#cccc37;">string</span>[] args)</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; {</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color:#2b91af;">MyType</span> a;</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color:#cccc37;">double</span> b = <span style="color:#8acccf;">10</span>;</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="color:#cccc37;">int </span>c;</p>
<p style="margin:0;">&#160;</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; a = b; // Invece di a.value;</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; c = (<span style="color:#cccc37;">int</span>)a; // Invece di c = a.value;</p>
<p style="margin:0;">&#160;</p>
<p style="margin:0;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>
<p style="margin:0;">&#160;&#160;&#160; }</p>
<p style="margin:0;">}</p>
</p></div>
<p>&#160;</p>
<p><strong>Da notare che gli operatori vanno definit static e pubblici.</strong></p>
<p>B) Fare l’override di ToString per consentire le conversioni verso string e l’override di Parse per le conversioni da string,</p>
<p>C) Implementare l’interfaccia System.IConvertible. Si tratta del overloading di una serie di metodi. Meglio far generare i metodi da Visual Studio ed implementare solo quelli che servono, lasciando gli altri generare l’eccezione NotImplementedException. </p>
<p>D) Implementare una classe TypeConverter che è utile per fare conversioni in design-time all’interno dell’ambiente di sviluppo Visual Studio per le Properties Window. Quest’ultimo metodo non è materia di esame. </p>
<p>Prossimo post: nuovo capitolo che parla dell’ I/O (Aiò!! Galapagos!) <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msolcia.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msolcia.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msolcia.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msolcia.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msolcia.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msolcia.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msolcia.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msolcia.wordpress.com/57/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msolcia.wordpress.com/57/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msolcia.wordpress.com/57/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=57&subd=msolcia&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://msolcia.wordpress.com/2009/02/05/converting-between-types-esame-70-536/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e0051e740b1ca91d27a7475b01f0a38b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">msolcia</media:title>
		</media:content>
	</item>
		<item>
		<title>Propositi per il 2009</title>
		<link>http://msolcia.wordpress.com/2009/01/09/propositi-per-il-2009/</link>
		<comments>http://msolcia.wordpress.com/2009/01/09/propositi-per-il-2009/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 10:19:04 +0000</pubDate>
		<dc:creator>msolcia</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://msolcia.wordpress.com/2009/01/09/propositi-per-il-2009/</guid>
		<description><![CDATA[Anno nuovo, vita nuova! Beh non esageriamo. Vi sono però alcuni propositi &#34;professionali&#34; che annoto qui in modo che il post mi faccia da &#34;memento&#34;. 
Nel 2009 mi piacerebbe: 
- Approfondire uso Unit Test soprattutto su codice Legacy, 
- Structure Map (Inversion of Control) 
- RhinoMock 
- Approfondire &#34;Domain Driven Design&#34; 
- NHibernate 
&#160;
Poca roba [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=53&subd=msolcia&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Anno nuovo, vita nuova! Beh non esageriamo. Vi sono però alcuni propositi &quot;professionali&quot; che annoto qui in modo che il post mi faccia da &quot;memento&quot;. </p>
<p>Nel 2009 mi piacerebbe: </p>
<p>- Approfondire uso Unit Test soprattutto su codice Legacy, </p>
<p>- Structure Map (Inversion of Control) </p>
<p>- RhinoMock </p>
<p>- Approfondire &quot;Domain Driven Design&quot; </p>
<p>- NHibernate </p>
<p>&#160;</p>
<p>Poca roba vero? <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' />  e tutta Alternativa (si veda ALT.NET)</p>
<p>&#160;</p>
<p>I primi tre punti devo assolutamente dominarli per poterli poi proporre all&#8217;interno del mio team, il 2009 deve essere l&#8217;anno dello &quot;unit test&quot; <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' />  quindi mi do come scadenza Aprile 2009. Già qualche mese fa ho comprato la versione MEAP (Mannings Early Access Program) di <a href="http://www.manning.com/osherove/" target="_blank">&quot;The Art of Unit Testing&quot;</a> e l’ho quasi finita. Ora però devo riassumere bene tutti i concetti e soprattutto cercare di applicarli. Non sarà facile.</p>
<p>Per NHibernate invece ho solo un interesse personale, essendo molto legato al discorso DDD. A questo non metto date.</p>
<p>&#160;</p>
<p>Vedremo vedremo</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msolcia.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msolcia.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msolcia.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msolcia.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msolcia.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msolcia.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msolcia.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msolcia.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msolcia.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msolcia.wordpress.com/53/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=53&subd=msolcia&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://msolcia.wordpress.com/2009/01/09/propositi-per-il-2009/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e0051e740b1ca91d27a7475b01f0a38b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">msolcia</media:title>
		</media:content>
	</item>
		<item>
		<title>Delegates C# 1.0, 2.0, 3.0 (parte 1)</title>
		<link>http://msolcia.wordpress.com/2009/01/02/delegates-c-10-20-30-parte-1/</link>
		<comments>http://msolcia.wordpress.com/2009/01/02/delegates-c-10-20-30-parte-1/#comments</comments>
		<pubDate>Fri, 02 Jan 2009 14:43:40 +0000</pubDate>
		<dc:creator>msolcia</dc:creator>
				<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://msolcia.wordpress.com/2009/01/02/delegates-c-10-20-30-parte-1/</guid>
		<description><![CDATA[Sempre dal libro “C# in depth” trovo interessante vedere come la sintassi per l’uso dei delegates sia variata dalla versione 1.0 sino alla version 3.0 di C#.
&#160;
Prendiamo come esempio il classico ambito di utilizzo dei delegates: la gestione degli eventi.
Supponiamo di avere un applicativo Winform con un pulsante “Button” e di voler tracciare, scrivendo sulla [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=52&subd=msolcia&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Sempre dal libro “C# in depth” trovo interessante vedere come la sintassi per l’uso dei delegates sia variata dalla versione 1.0 sino alla version 3.0 di C#.</p>
<p>&#160;</p>
<p>Prendiamo come esempio il classico ambito di utilizzo dei delegates: la gestione degli eventi.</p>
<p>Supponiamo di avere un applicativo Winform con un pulsante “Button” e di voler tracciare, scrivendo sulla console, i tre eventi: Key Press, Mouse Click e Click.</p>
<p>In C# 1.0 avremmo così fatto:</p>
<p>
<pre class="brush: csharp;"> &lt;/p&gt;  &lt;p&gt;static void LogClickEvent (object sender, EventArgs e)&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Console.WriteLine (“Log Click Event”);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;static void LogMouseClickEvent (object sender, MouseEventArgs e)&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Console.WriteLine (“Log Mouse Click Event”);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;static void LogKeyboardPresEvent (object sender, KeyPressEventArgs e)&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Console.WriteLine (“Log Keyboard Press Event”);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;…&lt;/p&gt;  &lt;p&gt;Button button = new Button();&lt;/p&gt;  &lt;p&gt;button.Text = “Click me”;&lt;/p&gt;  &lt;p&gt;button.Click += new EventHandler(LogClickEvent);&lt;/p&gt;  &lt;p&gt;button.KeyPress += new KeyPressEventHandler(LogKeyboardPresEvent);&lt;/p&gt;  &lt;p&gt;button.MouseClick += new MouseEventHandler(LogMouseClickEvent);&lt;/p&gt;  &lt;p&gt;…&lt;/p&gt;  &lt;p&gt;</pre>
</p>
<p>&#160;</p>
<p>Cioè in pratica per associare l’handler dell’evento: si crea una nuova istanza specificando il tipo di delegate e passando la action (cioè il metodo da chiamare).</p>
<p>Vediamo come avremmo potuto migliorare la scrittura del codice sopra, usando tre features che sono state introdotte nei delegates C# 2.0 e cioè:</p>
<p>1) conversione implicita da un method group ad un tipo di delegate compatibile.</p>
<p>2) supporto per i delegates di “return type covariance” e “parameter type contravariance”. </p>
<p>3) anonymous methpds</p>
<p>&#160;</p>
<p>Vediamo in dettaglio:</p>
<p>Per prima cosa sarebbe bello che il compilatore si occupasse di capire da solo il tipo del delegate, risparmiandoci il fatto di doverlo esplicitare nella clausola new.</p>
<p>Questo è possibile in C# 2.0 grazie ad <strong>una conversione implicita da un method group ad un tipo di delegate compatibile.</strong> Un method group è semplicemente il nome del metodo; viene chiamato method group in quanto ad un singolo nome di metodo possono essere associati diversi metodi con lo stesso nome ma che differiscono per i parametri (overloading). Grazie a questa conversione è possibile scrivere:</p>
<p>
<pre class="brush: csharp;"> &lt;/p&gt;  &lt;p&gt;…&lt;/p&gt;  &lt;p&gt;button.Click += LogClickEvent;&lt;/p&gt;  &lt;p&gt;button.KeyPress += LogKeyboardPresEvent;&lt;/p&gt;  &lt;p&gt;button.MouseClick += LogMouseClickEvent;&lt;/p&gt;  &lt;p&gt;…&lt;/p&gt;  &lt;p&gt;</pre>
</p>
<p>Più leggibile no?</p>
<p>Questa conversione implicita non funziona in tutti i casi. Proprio perchè si passa da un method group che può essere un insieme di metodi diversi, in alcuni casi il compilatore non è in grado di capire quale tipo di delegate si richiede. In questi casi si può effettuare un cast al tipo corretto.</p>
<p>Lo stesso libro invece che dare una regola suggerisce di usare la modalità “just try it”: cioè sperimentare con il codice, se il compilatore non si lamenta allora tutto ok. Io spesso e volentieri lo faccio, poi a posteriori cerco di capirne il motivo ma almeno ho passato l’ostacolo ed evito di scoraggiarmi.</p>
<p>&#160;</p>
<p>Un’altra feature introdotta in C# 2.0 è il <strong>supporto per i delegates di “return type covariance” e “parameter type contravariance”.</strong> Vediamo una semplice definizione: </p>
<p><strong>&quot;Return type Covariance”</strong> significa che un tipo ritornato può essere trattato come fosse un super-tipo.</p>
<p><strong>“Parameter type Contravariance” </strong>significa che un parametro di un certo tipo può essere trattato come un sotto-tipo</p>
<p>&#160;</p>
<p>Se guardiamo la definizione dei tre delegati usati per intercettare gli eventi, abbiamo:</p>
<p>
<pre class="brush: csharp;"> &lt;/p&gt;  &lt;p&gt;void EventHandler (object sender, EventArgs e)    &lt;br /&gt;void KeyPressEventHandler (object sender, KeyPressEventArgs e)     &lt;br /&gt;void MouseEventHandler (object sender, MouseEventArgs e)&lt;/p&gt;  &lt;p&gt;</pre>
</p>
<p>MouseEventArgs e KeyPressEventArgs derivano da EventArgs. Dal fatto che i delegate supportano “parameter type contravariance” possiamo usare oggetti di tipo MouseEventArgs e KeyPressEventArgs a metodi che si aspettano il tipo EventArgs, essendo sicuri che tali oggetti verranno trattati come i corrispondenti sotto tipi.</p>
<p>Se quindi prendiamo l’esempio originario ed immaginiamo di non dover distinguere tra gli eventi accaduti, ma solo tracciare il firing, possiamo scrivere il seguente codice: </p>
<p>
<pre class="brush: csharp;"> &lt;/p&gt;  &lt;p&gt;…&lt;/p&gt;  &lt;p&gt;button.Click += LogClickEvent;&lt;/p&gt;  &lt;p&gt;button.KeyPress += LogClickEvent;&lt;/p&gt;  &lt;p&gt;button.MouseClick += LogClickEvent;&lt;/p&gt;  &lt;p&gt;…&lt;/p&gt;  &lt;p&gt;</pre>
</p>
<p>&#160;</p>
<p>Far vedere il supporto di “return type covariance” è un po’ più difficile in quanto quasi tutti i delegate di .NET sono dichiarati con un return type void. Il libro ne definisce uno ad-hoc</p>
<p>
<pre class="brush: csharp;"> &lt;/p&gt;  &lt;p&gt;delegate Stream StreamFactory();&lt;/p&gt;  &lt;p&gt;static MemoryStream GenerateRandomData()&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;…&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;return new MemoryStream(buffer);&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;…&lt;/p&gt;  &lt;p&gt;StreamFactory factory = GenerateRandomData();&lt;/p&gt;  &lt;p&gt;Stream returnedStream = factory();&lt;/p&gt;  &lt;p&gt;</pre>
</p>
<p>&#160;</p>
<p>In pratica nonostante il delegate StreamFactory ritorni un tipo Stream, abbiamo associato una action (metodo GenerateRandomData) che ritorna un MemoryStream. L’invocazione all’ultima riga è possibile proprio grazie al supporto per “return type covariance”. Se nell’ultima riga cambiamo il tipo della variabile returnedStream a MemoryStream il compilatore darà errore poichè non sarà più possibile trovare un delegate corrispondente alla signature.</p>
<p>&#160;</p>
<p>Il prossimo post invece sulla terza feature introdotta con C# 2.0, quella ritenuta la più importante: anonymous methods. </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msolcia.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msolcia.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msolcia.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msolcia.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msolcia.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msolcia.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msolcia.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msolcia.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msolcia.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msolcia.wordpress.com/52/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=52&subd=msolcia&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://msolcia.wordpress.com/2009/01/02/delegates-c-10-20-30-parte-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e0051e740b1ca91d27a7475b01f0a38b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">msolcia</media:title>
		</media:content>
	</item>
		<item>
		<title>C# in depth</title>
		<link>http://msolcia.wordpress.com/2008/12/30/c-in-depth-2/</link>
		<comments>http://msolcia.wordpress.com/2008/12/30/c-in-depth-2/#comments</comments>
		<pubDate>Tue, 30 Dec 2008 11:24:55 +0000</pubDate>
		<dc:creator>msolcia</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://msolcia.wordpress.com/?p=49</guid>
		<description><![CDATA[Tra i numerosi libri che sto leggendo in questo momento vi è anche “C# in  depth” di Jon Skeet pubblicato da Manning (da cui ho comprato anche l’ottimo  “The art of unit testing” in versione pre-printed).
Sono ancora alle prime pagine ma il libro mi sta “prendendo assai”. Fa  sorridere dire una cosa [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=49&subd=msolcia&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Tra i numerosi libri che sto leggendo in questo momento vi è anche “C# in  depth” di Jon Skeet pubblicato da Manning (da cui ho comprato anche l’ottimo  “The art of unit testing” in versione pre-printed).</p>
<p>Sono ancora alle prime pagine ma il libro mi sta “prendendo assai”. Fa  sorridere dire una cosa del genere per un libro tecnico nel quale non si narra  una storia ma bensì la struttura di un linguaggio di programmazione. Eppure i  linguaggi di programmazione hanno, almeno per me, un fascino particolare: un po’  come i linguaggi “umani” essi nascono magari riprendendo altri linguaggi e pian  piano si evolvono, nel caso dei linguaggi di programmazione naturalmente grazie  alle estensioni fatte dai loro creatori, ma quasi sempre su suggerimento degli  utilizzatori. Come la possibilità di usare nuovi costrutti sintattici  (denominati syntatic sugar) per rendere il codice sempre più leggibile e sempre  più dichiarativo a scapito dell’imperativo (specificare cosa e non come).</p>
<p>C# è arrivato alla terza major release (anzi alla conferenza Microsoft PDC si  è parlato già della versione 4.0).</p>
<p>“C# in depth” è diverso dagli altri libri che insegnano ad usare C#, esso si  focalizza “solo” sui miglioramenti tra una versione e l’altra.</p>
<p>Il primo capitolo con un semplice esempio fa vedere come il codice scritto  nella versione 1.0 venga via via semplificato e reso migliore (nel senso di più  snello e leggibile) passando dalla 2.0 alla 3.0. Il codice viene man mano  trasformato con i seguenti passaggi che mi annoto a futura memoria:</p>
<p>C# 1.0: Read only properties –&gt; C# 2.0: Private property “setters” –&gt;  C# 3.0: Automatically implemented properties</p>
<p>C#1.0: Weakly typed collections (ArrayList) –&gt; C# 2.0: Strongly typed  collections (generics) –&gt; C# 3.0: Enhanced collection and object  initialization.</p>
<p>C#1.0: Weakly typed comparator –&gt; C# 2.0: Strongly Typed comparator –&gt;  C# 3.0: Lambda Expressions</p>
<p>C#1.0: No delegate sorting option –&gt; C# 2.0: Delegate comparisons +  anonymous methods –&gt; C# 3.0: Extension methods + Option of leaving list  unsorted</p>
<p>C#1.0: extra work to cope with null in value type variables –&gt; C#2.0/3.0:  Use of Nullable types</p>
<p>Se vi interessa l’argomento è sicuramente un ottimo libro, scritto in un  inglese chiaro, con pochi esempi ma quelli giusti.</p>
<p>Beh il 2008 è agli sgoccioli, non mi rimane che augurare a tutti i miei lettori (2) un Buon 2009 ricco di belle novità.</p>
<p>Chissà se nel 2009 riuscirò a scrivere un po&#8217; di più su questo blog.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msolcia.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msolcia.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msolcia.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msolcia.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msolcia.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msolcia.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msolcia.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msolcia.wordpress.com/49/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msolcia.wordpress.com/49/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msolcia.wordpress.com/49/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=49&subd=msolcia&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://msolcia.wordpress.com/2008/12/30/c-in-depth-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e0051e740b1ca91d27a7475b01f0a38b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">msolcia</media:title>
		</media:content>
	</item>
		<item>
		<title>Constructing classes &#8211; Parte 2 (Esame 70-536)</title>
		<link>http://msolcia.wordpress.com/2008/12/10/constructing-classes-parte-2-esame-70-536/</link>
		<comments>http://msolcia.wordpress.com/2008/12/10/constructing-classes-parte-2-esame-70-536/#comments</comments>
		<pubDate>Wed, 10 Dec 2008 16:30:35 +0000</pubDate>
		<dc:creator>msolcia</dc:creator>
				<category><![CDATA[Certification]]></category>
		<category><![CDATA[Exam 70-536]]></category>

		<guid isPermaLink="false">http://msolcia.wordpress.com/2008/12/10/constructing-classes-parte-2-esame-70-536/</guid>
		<description><![CDATA[Nell’ultimo post mi sono occupato di ereditarietà, interfacce, partial class e generics. Per completare gli strumenti che ci aiutano nella costruzione delle nostre classi, vediamo ora Attribute, Event e Type Forwarding:
Attribute: un attributo consente di contraddistinguere (taggare) un metodo, una proprietà, un tipo con informazioni che possono essere lette ed utilizzate programmaticamente. Ad esempio il [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=45&subd=msolcia&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Nell’ultimo post mi sono occupato di ereditarietà, interfacce, partial class e generics. Per completare gli strumenti che ci aiutano nella costruzione delle nostre classi, vediamo ora Attribute, Event e Type Forwarding:</p>
<p><strong>Attribute</strong>: un attributo consente di contraddistinguere (taggare) un metodo, una proprietà, un tipo con informazioni che possono essere lette ed utilizzate programmaticamente. Ad esempio il runtime leggendo questi attributi può: conoscere quali privilegi sono richiesti da una classe, quali capacità ha la classe, descrivere l’autore, ecc. </p>
<p>Tutti i tipi di attributi derivano dalla classe <strong>System.Attribute </strong>e la sintassi prevede che siano inseriti all’interno delle parentesi quadre.</p>
<p>Esempio:</p>
<p>
<pre class="brush: csharp;">  [assembly: AssemblyCompany(&amp;quot;Microsoft Learning&amp;quot;)]  [assembly: AssemblyProduct(&amp;quot;ch01cs&amp;quot;)]  [assembly: AssemblyCopyright(&amp;quot;Copyright © 2006&amp;quot;)]  [assembly: AssemblyTrademark(&amp;quot;&amp;quot;)][assembly:FileIOPermissionAttribute(SecurityAction.RequestMinimum, Read=@&amp;quot;C:\boot.ini&amp;quot;)] </pre>
</p>
<p><strong>Event</strong> : il concetto di evento non è certamente nuovo per chi, come me, ha iniziato a programmare su Windows 3.1. Ho ancora da qualche parte i due libri di Charles Petzold, quanti ricordi <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<p align="center"><a href="http://msolcia.files.wordpress.com/2008/12/pw2.png"><img title="pw2" style="border-width:0;" height="244" alt="pw2" src="http://msolcia.files.wordpress.com/2008/12/pw2-thumb.png?w=196&#038;h=244" width="196" border="0" /></a>&#160;</p>
<p>Un evento è un segnale che avvisa che una certa azione è accaduta.</p>
<p>L’evento viene inviato da una classe (event sender) che non conosce chi sarà la classe che gestirà l’evento (event receiver). Vi è invece un meccanismo posto tra i due che veicola gli eventi dal sender al receiver. Tale meccanismo in .NET è costituito dai <strong>delegate</strong>.</p>
<p>Piccola parentesi:</p>
<p>Cos’è un delegate? Un delegate è una classe che mantiene un puntatore ad un metodo con una specifica signature.&#160; </p>
<p>La dichiarazione del metodo delegate è sufficiente a specificare la classe delegate.</p>
<p>I delegate sono usati in molti ambiti tra cui la gestione degli eventi.</p>
<p>La signature standard di un delegate che gestisce gli eventi, è un metodo che:</p>
<p>1) non ritorna valori,</p>
<p>2) ha come primo parametro un’istanza di tipo object, che rappresenta l’event sender</p>
<p>3) ha come secondo parametro un’istanza di un tipo derivato da EventArgs che contiene dettagli specifici del tipo di evento. A seconda dell’evento infatti diversi sono i dettagli e diverse sono le classi usate tutte derivate da EventArgs.</p>
<p>Il delegate EventHandler è predefinito e può essere usato per quando il metodo che risponde ad un evento non genera dati. Se invece l’evento genera dati allora bisogna creare un nuovo delegate che abbia come secondo parametro un proprio tipo custom, o usare la versione generica del delegate EventHandler usando il tipo corretto.</p>
<p>Per associare un evento al metodo di gestione, è sufficiente aggiungere un’istanza del delegate all’evento. </p>
<p>Esempio:</p>
<p>1) Creiamo il metodo di gestione dell’evento in modo che segua la signature del delegate EventHandler</p>
<p>
<pre class="brush: csharp;">  private void button1_Click(object sender, EventArgs e)  {    // Method code  } </pre>
</p>
<p>2) Aggiungiamo il metodo all’evento “Click” di un ipotetico “button1”</p>
<pre class="brush: csharp;">  this.button1.Click += new System.EventHandler(this.button1_Click); </pre>
</p>
<p><strong>Type Forwarding </strong></p>
<p>Type forwarding consente di “muovere” un tipo da un assembly A in un altro assembly B facendolo a runtime, cioè senza modificare nessuna riga del codice sorgente.</p>
<p>Lo si fa per esempio con le seguenti righe di codice:</p>
<pre class="brush: csharp;">   using System.Runtime.CompilerServices;  [assembly:TypeForwardedTo(typeof(DestLib.TypeA))] </pre>
</p>
<p>Ma quando la userò mai questa feature?</p>
<p>Seguendo la tabella di marcia, il prossimo post cercherà di riassumere il capitolo “Conversione dei tipi”.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msolcia.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msolcia.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msolcia.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msolcia.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msolcia.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msolcia.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msolcia.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msolcia.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msolcia.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msolcia.wordpress.com/45/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=45&subd=msolcia&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://msolcia.wordpress.com/2008/12/10/constructing-classes-parte-2-esame-70-536/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e0051e740b1ca91d27a7475b01f0a38b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">msolcia</media:title>
		</media:content>

		<media:content url="http://msolcia.files.wordpress.com/2008/12/pw2-thumb.png" medium="image">
			<media:title type="html">pw2</media:title>
		</media:content>
	</item>
		<item>
		<title>Questione di stile</title>
		<link>http://msolcia.wordpress.com/2008/11/26/questione-di-stile/</link>
		<comments>http://msolcia.wordpress.com/2008/11/26/questione-di-stile/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 12:05:19 +0000</pubDate>
		<dc:creator>msolcia</dc:creator>
				<category><![CDATA[Applications & Tools]]></category>

		<guid isPermaLink="false">http://msolcia.wordpress.com/2008/11/26/questione-di-stile/</guid>
		<description><![CDATA[Scrivere un programma è come scrivere un testo (un libro): lo si fa per comunicare qualcosa e lo si fa usando la grammatica e la sintassi del linguaggio. 
Questo significa che per dire la medesima cosa si possono usare parole, espressioni, idiomi differenti. Solitamente un autore ha il suo stile, esso può anche cambiare intenzionalmente [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=38&subd=msolcia&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Scrivere un programma è come scrivere un testo (un libro): lo si fa per comunicare qualcosa e lo si fa usando la grammatica e la sintassi del linguaggio. </p>
<p>Questo significa che per dire la medesima cosa si possono usare parole, espressioni, idiomi differenti. Solitamente un autore ha il suo stile, esso può anche cambiare intenzionalmente da libro a libro, ma difficilmente cambia all’interno dello stesso libro.</p>
<p>Idem con il codice, ognuno di noi ha il proprio stile di programmazione dato dall’esperienza e dal diverso modo di pensare/di approciare il problema. Se questo, riferendosi ad un libro è un bene, avere programmi o peggio parti del medesimo programma scritte da autori diversi con stili diversi, può diventare un problema. E’ come avere un libro scritto da diversi autori ciascuno con il proprio stile: anche se particolare, sarebbe sicuramente di difficile lettura. La situazione è ancor più tragica in un software, dove l’analisi e la correzione di possibili errori obbliga a rileggere e modificare parti scritte da altri (e quindi con stili diversi).</p>
<p>Insomma senza dover uniformare completamente il modo di scrivere software, che sarebbe un po’ snaturare la bellezza di questa attività che molti paragonano ad un arte, si può cercare di condividere alcune scelte di stile. Queste scelte denominate anche convenzioni o “coding convention” sono, come detto, dettate da necessità sicuramente diverse da chi scrive un libro. Wikipedia elenca le seguenti:</p>
<blockquote><p>Code conventions are important to programmers for a number of reasons:</p>
<ul>
<li>80% of the lifetime cost of a piece of software goes to maintenance. </li>
<li>Hardly any software is maintained for its whole life by the original author. </li>
<li>Code conventions improve the readability of the software, allowing engineers to understand new code more quickly and thoroughly. </li>
<li>If you ship your source code as a product, you need to make sure it is as well packaged and clean as any other product you create. </li>
</ul>
</blockquote>
<p>&#160;</p>
<p>Noi nel nostro team abbiamo una serie di naming convention, che sono un sottoinsieme delle coding convention relativamente a come chiamare gli identificatori (variabili, procedure, ecc). </p>
<p>Io sto cercando di andare più in là e mi sono dotato di un tool che la stessa Microsoft usa per identificare le parti di codice che non aderiscono alle convenzioni stabilite negli anni. Tale tool si chiama guardacaso StyleCop. </p>
<p>Si tratta di un progetto open-source e lo si può trovare <a href="http://code.msdn.microsoft.com/sourceanalysis" target="_blank">qui</a>. Esso si integra in Visual Studio e lo si può eseguire e configurare facendo click-destro sulla finestre del Solution Explorer. Per ogni violazione di stile viene riportato un warning con la descrizione del problema.</p>
<p>Per coloro che usano <a href="http://www.jetbrains.com/resharper/" target="_blank">ReSharper</a>, un ottimo tool che aiuta nella stesura del codice, vi è anche un <a href="http://www.codeplex.com/StyleCopForReSharper" target="_blank">add-in</a> che consente di eseguire l’analisi dello stile man mano che si scrive il codice.</p>
<p>Davvero degli utili tool per cercare di migliorare il “nostro” stile di bravi artisti scrittori di codice <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/msolcia.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/msolcia.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/msolcia.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/msolcia.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/msolcia.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/msolcia.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/msolcia.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/msolcia.wordpress.com/38/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/msolcia.wordpress.com/38/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/msolcia.wordpress.com/38/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=msolcia.wordpress.com&blog=2055160&post=38&subd=msolcia&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://msolcia.wordpress.com/2008/11/26/questione-di-stile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e0051e740b1ca91d27a7475b01f0a38b?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">msolcia</media:title>
		</media:content>
	</item>
	</channel>
</rss>