<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>.NET</title>
        <link>http://blogs.ugidotnet.org/Andrew/category/.NET.aspx</link>
        <description>.NET</description>
        <language>it-IT</language>
        <copyright>Andrea Sansottera</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>C++ Express: compatibilità, terminazioni di linea e codifica Unicode</title>
            <link>http://blogs.ugidotnet.org/Andrew/archive/2005/11/24/30490.aspx</link>
            <description>Nelle ultime settimane mi sono imbattuto in tre features di Visual C++ Express.&amp;nbsp;Sono caratteristiche&amp;nbsp;poco "appariscenti", sulle quali sarebbe sprecato fare marketing, ma che si sono rivelate particolarmente utili.
1. E' possibile aprire&amp;nbsp;vecchi progetti per Visual C++ 6. La procedura di conversione &amp;#232; pressoch&amp;#232; indolore. Naturalmente, a causa degli allineamenti agli standard C++, &amp;#232; possibile che il nuovo compilatore generi messaggi di avviso, indicando che vengono usati costrutti sintattici deprecati.

2.&amp;nbsp;Durante l'apertura di un file, l'editor&amp;nbsp;rileva automaticamente&amp;nbsp;se la&amp;nbsp;convenzione di terminazione linea &amp;#232; consistente e, in caso contrario, propone un allineamento con lo standard per Windows, Unix o Macintosh.

3. Per impostazione definita i file sorgenti vengono salvati con codifica a 8 bit. Tuttavia, durante l'editing &amp;#232; possibile&amp;nbsp;inserire caratteri Unicode. Al momento del salvataggio, verra chiesto se si vuole passare alla codifica Unicode a 16 bit&amp;nbsp;o ad una diversa codifica ASCII estesa. E'&amp;nbsp;inoltre possibile applicare la stessa scelta agli altri file del progetto.
&lt;img src="http://blogs.ugidotnet.org/Andrew/aggbug/30490.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Sansottera</dc:creator>
            <guid>http://blogs.ugidotnet.org/Andrew/archive/2005/11/24/30490.aspx</guid>
            <pubDate>Thu, 24 Nov 2005 16:33:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/Andrew/archive/2005/11/24/30490.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/Andrew/comments/commentRss/30490.aspx</wfw:commentRss>
        </item>
        <item>
            <title>NUnit 2.2.3</title>
            <link>http://blogs.ugidotnet.org/Andrew/archive/2005/11/19/30213.aspx</link>
            <description>E'&amp;nbsp;stato rilasciato NUnit 2.2.3, una nuova "iteration release", che include significative correzioni di bugs e&amp;nbsp;nuove asserzioni. E' possibile leggere le release notes e scaricarlo a questo indirizzo.&amp;nbsp;Sebbene sia stato compilato&amp;nbsp;con Visual Studio 2003,&amp;nbsp;funziona sul runtime di .NET 2.0. In realt&amp;#224;, anche con le versioni precedenti di NUnit, previa modifica del file di configurazione, non ho&amp;nbsp;riscontrato problemi. La buona notizia &amp;#232; che, passando&amp;nbsp;una semplice opzione&amp;nbsp;a linea di comando, &amp;#232; ora possibile eseguire NUnit su una qualunque versione&amp;nbsp;del framework disponibile sulla macchina.&amp;nbsp;Altrimenti, per testare assembly creati con&amp;nbsp;Visual Studio 2005,&amp;nbsp;&amp;#232; sufficiente&amp;nbsp;decommentare la sezione "startup" del file di configurazione "nunit-gui.exe.config". Happy testing! :)&lt;img src="http://blogs.ugidotnet.org/Andrew/aggbug/30213.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Sansottera</dc:creator>
            <guid>http://blogs.ugidotnet.org/Andrew/archive/2005/11/19/30213.aspx</guid>
            <pubDate>Sat, 19 Nov 2005 16:57:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/Andrew/archive/2005/11/19/30213.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/Andrew/comments/commentRss/30213.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Cleanup deterministico e finalizers in C++/CLI</title>
            <link>http://blogs.ugidotnet.org/Andrew/archive/2005/05/06/15704.aspx</link>
            <description>
Vediamo il seguente codice.&amp;nbsp;Viene definito&amp;nbsp;un 
reference type (typeid = Person), con un metodo publico, 
ReadMessage. Al suo interno viene utilizzato in tre modi diversi un 
oggetto di tipo System::IO::StreamReader, classe che implementa 
System::IDisposable.
public&amp;nbsp;ref&amp;nbsp;class&amp;nbsp;Person{public:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Person&amp;nbsp;(String^&amp;nbsp;name,&amp;nbsp;String^&amp;nbsp;surname)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void&amp;nbsp;ReadMessage&amp;nbsp;(String^&amp;nbsp;path)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stream^&amp;nbsp;stream&amp;nbsp;=&amp;nbsp;(Person::typeid)-&amp;gt;Assembly-&amp;gt;GetManifestResourceStream&amp;nbsp;(path);#ifdef&amp;nbsp;MANUAL_DETERMINISTIC_CLEANUP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;I&amp;nbsp;manually&amp;nbsp;call&amp;nbsp;the&amp;nbsp;distructor.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StreamReader^&amp;nbsp;reader&amp;nbsp;=&amp;nbsp;gcnew&amp;nbsp;StreamReader&amp;nbsp;(stream);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console::WriteLine&amp;nbsp;(reader-&amp;gt;ReadLine&amp;nbsp;());&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete&amp;nbsp;reader;#endif#ifdef&amp;nbsp;AUTOMATIC_CLEANUP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Garabace&amp;nbsp;collector&amp;nbsp;will&amp;nbsp;call&amp;nbsp;the&amp;nbsp;dispose&amp;nbsp;methods&amp;nbsp;before&amp;nbsp;finalizing&amp;nbsp;the&amp;nbsp;reader.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StreamReader^&amp;nbsp;reader&amp;nbsp;=&amp;nbsp;gcnew&amp;nbsp;StreamReader&amp;nbsp;(stream);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console::WriteLine&amp;nbsp;(reader-&amp;gt;ReadLine&amp;nbsp;());#endif#ifdef&amp;nbsp;AUTOMATIC_DETERMINISTIC_CLEANUP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;The&amp;nbsp;compiler&amp;nbsp;automatic&amp;nbsp;inserts&amp;nbsp;a&amp;nbsp;method&amp;nbsp;call&amp;nbsp;to&amp;nbsp;dispose.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;The&amp;nbsp;reference&amp;nbsp;type&amp;nbsp;instance&amp;nbsp;has&amp;nbsp;value&amp;nbsp;semantic&amp;nbsp;in&amp;nbsp;this&amp;nbsp;context.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StreamReader&amp;nbsp;reader&amp;nbsp;(stream);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console::WriteLine&amp;nbsp;(reader.ReadLine&amp;nbsp;());#endif&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}};

Decompiliamo con Reflector e 
vediamo come apparirebbe, nei diversi casi,&amp;nbsp;il&amp;nbsp;metodo 
ReadMessage&amp;nbsp;se fosse scritto in C#.
Nel primo caso reader è stato dichiarato come un&amp;nbsp;handle, al 
quale&amp;nbsp;abbiamo è stato assegnato un oggetto allocato sul managed 
heap tramite l'operatore gcnew       
       
 .&amp;nbsp;Dopo&amp;nbsp;essere stato&amp;nbsp;utilizzato, l'oggetto viene "distrutto"&amp;nbsp;con l'operatore 
delete. Tale 
operatore viene&amp;nbsp;sostanzialmente           
  tradotto in un'eventuale chiamata al metodo 
Dispose (per gli oggetti il cui tipo implementa IDisposable*). 
Come noto, tale metodo nasce con lo scopo fondamentale di rilascare le 
risorse utilizzate dal nostro oggetto, non la memoria. 
La deallocazione sarà gestita dal garbage collector, che in 
questo caso, vedendo che è già stato eseguito il cleanup, non chiamerà&amp;nbsp; 
il distruttore o l'eventuale finalizzatore **. Codice C#:
public&amp;nbsp;void&amp;nbsp;ReadMessage(string&amp;nbsp;path){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;num1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stream&amp;nbsp;stream1&amp;nbsp;=&amp;nbsp;null;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StreamReader&amp;nbsp;reader1&amp;nbsp;=&amp;nbsp;null;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stream1&amp;nbsp;=&amp;nbsp;typeof(Person).Assembly.GetManifestResourceStream(path);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reader1&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StreamReader(stream1);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(reader1.ReadLine());&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IDisposable&amp;nbsp;disposable1&amp;nbsp;=&amp;nbsp;reader1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(disposable1&amp;nbsp;!=&amp;nbsp;null)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;disposable1.Dispose();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num1&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num1&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}}
Nel secondo caso, invece, non distruggendo l'oggetto, lasciamo che 
sia il garbage collector a scaricare le risorse invocando il distruttore prima della finalizzazione. Ciò 
signfica che fino a un tempo imprecisato le nostre risorse 
rimarrano utilizzate   
           
     .&amp;nbsp;Codice C#:
public&amp;nbsp;void&amp;nbsp;ReadMessage(string&amp;nbsp;path){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stream&amp;nbsp;stream1&amp;nbsp;=&amp;nbsp;null;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StreamReader&amp;nbsp;reader1&amp;nbsp;=&amp;nbsp;null;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stream1&amp;nbsp;=&amp;nbsp;typeof(Person).Assembly.GetManifestResourceStream(path);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reader1&amp;nbsp;=&amp;nbsp;new&amp;nbsp;StreamReader(stream1);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(reader1.ReadLine());}
Nel terzo caso invece vediamo un reference type object 
dichiarato come se fosse&amp;nbsp;di un&amp;nbsp;tipo valore. In 
realtà, questa è una semplice "illusione" propinataci dal compilatore. Il nostro 
oggetto è allocato sul managed heap, ma la semantica che esso 
assume, dal nostro punto di vista, è quella di un oggetto sullo stack. Questo ha 
un'importante implicazione: il compilatore genera automaticamente il 
codice per rilasciare le risorse usate dal nostro oggetto (ovviamente 
solo se necessario, ovvero se implementa IDisposable ), 
esattamente come il C++ nativo inserisce una chiamata ai distruttori delle 
variabili automatiche alla fine del metodo. Questo idioma, noto come 
deterministic finalization, è diventato in 
C++/CLI un nuovo&amp;nbsp;idioma, analogo ma differente&amp;nbsp;(a causa 
della&amp;nbsp;diversa implementazione dell'operatore delete), 
detto&amp;nbsp;deterministic cleanup           
             
      . Codice C#: 
public&amp;nbsp;void&amp;nbsp;ReadMessage(string&amp;nbsp;path){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Stream&amp;nbsp;stream1&amp;nbsp;=&amp;nbsp;null;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StreamReader&amp;nbsp;reader1&amp;nbsp;=&amp;nbsp;null;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;stream1&amp;nbsp;=&amp;nbsp;typeof(Person).Assembly.GetManifestResourceStream(path);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StreamReader&amp;nbsp;modopt(IsConst)&amp;nbsp;local1&amp;nbsp;=&amp;nbsp;(StreamReader&amp;nbsp;modopt(IsConst))&amp;nbsp;new&amp;nbsp;StreamReader(stream1);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reader1&amp;nbsp;=&amp;nbsp;local1;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(reader1.ReadLine());&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fault&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reader1.Dispose();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reader1.Dispose();}
* In C++/CLI una classe dichiarata con un distruttore, è mappata 
automaticamente in una classe che implementa IDisposable e il suo distruttore è    
   mappato nel metodo Dispose.
** In C++/CLI è possibile dichiarare un 
finalizzatore         
            
. In questo modo, quando l'oggetto sta per essere&amp;nbsp;distrutto non in maniera 
deterministica,&amp;nbsp;bensì&amp;nbsp;appena prima di una garbage collection&amp;nbsp;è possibile svolgere un po' di custom behavior 
(per esempio tracciarlo)... oltre a invocare, com'è naturale, il distruttore affinchè vengano rilasciate le risorse.
Questo è possibile perchè il compilatore genera in questo modo il 
metodo Dispose:
protected&amp;nbsp;virtual&amp;nbsp;void&amp;nbsp;Dispose([MarshalAs(UnmanagedType.U1)]&amp;nbsp;bool&amp;nbsp;flag1){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(flag1)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.~Person();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.!Person();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;finally&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base.Finalize();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}}
Anzichè quello che avremmo in assenza di un 
finalizzatore      :
protected&amp;nbsp;virtual&amp;nbsp;void&amp;nbsp;Dispose([MarshalAs(UnmanagedType.U1)]&amp;nbsp;bool&amp;nbsp;flag1){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(flag1)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.~Person();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;base.Finalize();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}}
Vediamo quindi il seguente esempio:
using&amp;nbsp;namespace&amp;nbsp;System;public&amp;nbsp;ref&amp;nbsp;class&amp;nbsp;Person{private:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String^&amp;nbsp;name_;public:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Person&amp;nbsp;(String^&amp;nbsp;name):&amp;nbsp;name_&amp;nbsp;(name)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;~Person&amp;nbsp;()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console::WriteLine&amp;nbsp;(name_&amp;nbsp;+&amp;nbsp;":&amp;nbsp;I'm&amp;nbsp;releasing&amp;nbsp;resources...!");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;!Person&amp;nbsp;()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console::WriteLine&amp;nbsp;(name_&amp;nbsp;+&amp;nbsp;":&amp;nbsp;I'm&amp;nbsp;going&amp;nbsp;to&amp;nbsp;be&amp;nbsp;finalized...!");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console::WriteLine&amp;nbsp;(name_&amp;nbsp;+&amp;nbsp;":&amp;nbsp;I&amp;nbsp;will&amp;nbsp;call&amp;nbsp;the&amp;nbsp;destructor...!");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delete&amp;nbsp;this;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}};void&amp;nbsp;DeterministicCleanupBehavior&amp;nbsp;(){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Person&amp;nbsp;person&amp;nbsp;("Guy&amp;nbsp;on&amp;nbsp;the&amp;nbsp;heap&amp;nbsp;with&amp;nbsp;stack&amp;nbsp;semantic");}void&amp;nbsp;NonDeterministicCleanupBehavior&amp;nbsp;(){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Person^&amp;nbsp;person&amp;nbsp;=&amp;nbsp;gcnew&amp;nbsp;Person&amp;nbsp;("Guy&amp;nbsp;on&amp;nbsp;the&amp;nbsp;heap");}int&amp;nbsp;main(array&amp;lt;System::String&amp;nbsp;^&amp;gt;&amp;nbsp;^args){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console::WriteLine&amp;nbsp;("Began!");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DeterministicCleanupBehavior&amp;nbsp;();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NonDeterministicCleanupBehavior&amp;nbsp;();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console::WriteLine&amp;nbsp;("Ended!");&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;0;}
Produrrà il seguente output:

  Began!Guy on the heap with stack semantic: I'm releasing 
  resources...!Ended!Guy on the heap: I'm going to be 
  finalized...!Guy on the heap: I will call the destructor...!Guy on the 
  heap: I'm releasing resources...!
In realtà non potremmo prevedere quando viene 
finalizzato dal garbage collector il nostro "guy on the heap"... ma essendo il 
programma molto breve è naturale che&amp;nbsp;venga scaricato soltanto alla fine 
dell'esecuzione (è ovvio che se dopo la chiamata a 
NonDeterministicCleanupBehavior il nostro programma&amp;nbsp;eseguisse una 
lunga serie di istruzioni&amp;nbsp;sarebbe probabile che il "guy on the heap" venga 
finalizzato in un qualche istante prima della terminazione del 
processo).
&lt;img src="http://blogs.ugidotnet.org/Andrew/aggbug/15704.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Sansottera</dc:creator>
            <guid>http://blogs.ugidotnet.org/Andrew/archive/2005/05/06/15704.aspx</guid>
            <pubDate>Fri, 06 May 2005 02:05:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/Andrew/archive/2005/05/06/15704.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/Andrew/comments/commentRss/15704.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Membership Provider for Firebird</title>
            <link>http://blogs.ugidotnet.org/Andrew/archive/2005/05/02/15474.aspx</link>
            <description>Ispirato e istruito dalla sessione di Andrea, spero di poter iniziare questa settimana questo piccolo progetto.
Si tratta&amp;nbsp;innanzitutto di creare uno script per la creazione del database e poi codare il membership provider.
Appena lo comincio apro un nuovo workspace su GotDotNet!&lt;img src="http://blogs.ugidotnet.org/Andrew/aggbug/15474.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Sansottera</dc:creator>
            <guid>http://blogs.ugidotnet.org/Andrew/archive/2005/05/02/15474.aspx</guid>
            <pubDate>Mon, 02 May 2005 12:33:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/Andrew/archive/2005/05/02/15474.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/Andrew/comments/commentRss/15474.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Enterprise Library for Firebird: moved</title>
            <link>http://blogs.ugidotnet.org/Andrew/archive/2005/05/02/15473.aspx</link>
            <description>Ho deciso di spostare il progetto su GotDotNet. Pubblicher&amp;#242; l&amp;#236;&amp;nbsp;news (con feeds RSS!),&amp;nbsp;nuove releases, etc.. Ci sono&amp;nbsp;anche un forum e un bug tracker, che naturalmente potete utilizzare.
Ho gi&amp;#224; pubblicato le due "vecchie" releases (0.6 e 0.7.0) e i sorgenti sfruttando il sistema di source control (integrato tramite plugin&amp;nbsp;in Visual Studio!).
Ora vorrei creare un installer (in bundle con l'Enterprise Library e il provider ADO.NET per Firebird). Devo soltanto trovare il tempo di leggere le licenze e realizzarlo.
Putroppo non sono ancora riuscito a fare una pagina di redirect sul vecchio sito perch&amp;#232; ho dimenticato la password... trover&amp;#242; un sistema per farlo (spero!).
Nome workspace: Enterprise Library for Firebird
Indirizzo: http://www.gotdotnet.com/Workspaces/Workspace.aspx?id=1f216647-4011-40cd-8dc7-174eda97aad1
&amp;nbsp;&lt;img src="http://blogs.ugidotnet.org/Andrew/aggbug/15473.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Sansottera</dc:creator>
            <guid>http://blogs.ugidotnet.org/Andrew/archive/2005/05/02/15473.aspx</guid>
            <pubDate>Mon, 02 May 2005 12:30:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/Andrew/archive/2005/05/02/15473.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/Andrew/comments/commentRss/15473.aspx</wfw:commentRss>
        </item>
        <item>
            <title>n-mila versioni di Visual Studio</title>
            <link>http://blogs.ugidotnet.org/Andrew/archive/2005/04/27/15285.aspx</link>
            <description>
Condividendo le opinioni di Andrea in merito all'inclusione nei soli prodotti Team System degli strumenti per lo unit testing, volevo ora portare il ragionamento un po' oltre.
Per quale motivo tutte queste versioni di Visual Studio? Probabilmente ci avrete gi&amp;#224; pensato: perch&amp;#232; non rilasciare una piattaforma, che potremmo chiamare "Visual Studio Foundation", e poi tutti i plugin del caso, acquistabili separatamente e in ogni momento? Insomma un modello &amp;#224;la Eclipse o Netbeans...
Immaginate di avvicinarvi alla programmazione in ambiente Windows. Ad oggi, probabilmente su consiglio di qualche amico, compreresti uno dei prodotti express, diciamo C# Express. Se non avete mai fatto unit testing, e un giorno decideste di imparare a farlo, molto difficilmente acquistereste i Team System, dopo una breve ricerca su Google troverete probabilmente NUnit. A un certo punto potrebbe nascere l'esigenza di sviluppare un'applicazione web... a quel punto tornereste dal rivenditore di fiducia e comprare Visual Web Developer... o magari la versione&amp;nbsp;Professional. E se un giorno doveste iniziare a lavorare in un gruppo di 5 o 10 persone? Oppure se voleste semplicemente progettare un software e vorreste usare il class designer? Un nuovo acquisto probabilmente... 
E se invece bastasse una semplice puntatina sul nuovo scintillante "Visual Studio Extensibility Center" di Microsoft... un paio di click, il numero di carta di credito... qualche minuto di download... per avere immediatamente integrati nel vostro "Visual Studio Foundation" i plugin che soddisfano le vostre esigenze? Un plugin per C#, poi uno per le Windows forms, un altro per le web forms... poi quello per lo unit testing, magari un giorno potreste desiderare il class designer... o magari un collega potrebbe passarvi del codice VB, o C++... e allora scegliereste l'estensione oppurtuna per il vostro ambiente. Tutto questo andrebbe ad affiancarsi, naturalmente, ai numerosi plugin, gi&amp;#224; esistenti,&amp;nbsp;di terze parti (ad esempio,&amp;nbsp;quello per Eiffel).&lt;img src="http://blogs.ugidotnet.org/Andrew/aggbug/15285.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Sansottera</dc:creator>
            <guid>http://blogs.ugidotnet.org/Andrew/archive/2005/04/27/15285.aspx</guid>
            <pubDate>Wed, 27 Apr 2005 10:31:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/Andrew/archive/2005/04/27/15285.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/Andrew/comments/commentRss/15285.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Visual C++ 2005 and *.vcproj</title>
            <link>http://blogs.ugidotnet.org/Andrew/archive/2005/04/20/14495.aspx</link>
            <description>
Se state usando Visual C++ 2005, vi sarete probabilmente accorti che l'ambiente non &amp;#232; ancora del tutto completo. Esistono alcune limitazioni nella gestione del progetto (file di risorsa, file di soluzione, etc.). Non so se queste rimarranno limitazioni del prodotto Express definitivo, ad ogni modo potete ovviare a questi problemi scrivendo manualmente il file di progetto e vcbuild.exe per compilarlo. Qui potete trovate lo schema XML:
http://msdn2.microsoft.com/library/y4sy8216(en-us,vs.80).aspx
Il designer &amp;#232; decisamente migliorato, tuttavia, a mio parere, genera un pessimo codice. Sarebbe stato importante, per lo meno, che separasse le implementazioni dei&amp;nbsp;metodi&amp;nbsp;(in particolare, del costruttore e dei delegati che gestiscono gli eventi) dalla loro dichiarazione, come &amp;#232; comune fare nei progetti C/C++.
Tra le note completamente positive, potrei citare l'intellisense, perfettamente funzionante, la comoda "start page" e le performance complessive dell'ambiente di sviluppo, che risulta decisamente pi&amp;#249; veloce e leggero di Visual Studio 2003 Professional o di altri IDE per Java.
Il lavoro svolto da&amp;nbsp; Sutter, Lipman e colleghi &amp;#232; veramente eccezionale. Ora manca solo la standardizzazione da parte dell'ECMA. La nuova sintassi &amp;#232; un'ottimo compromesso tra eleganza, integrazione con le funzionalit&amp;#224; offerte dal CLR e mantenimento degli idiomi tipici del C++. Confrontando alcune semplici classi che ho scritto sia in C#, sia&amp;nbsp;in C++/CLI l'impressione &amp;#232; che il secondo linguaggio abbia dato al mio codice una forma estremamente pi&amp;#249; elegante e mantenibile. I motivi principali sono i seguenti:
1. Distinzione tra dichiarazione (in un file header) e implementazione. In questo modo, guardando il file header&amp;nbsp;risulta immediatamente visibile com'&amp;#232; strutturata una classe, senza bisogno di scorrere tra tutte le linee di codice. Ok, il class viewer fa anch'esso un ottimo lavoro in merito, ma supportare questo stile di programmazione a livello di codice,&amp;nbsp;secondo me &amp;#232; molto importante.
2. Tipi valore e tipi riferimento sono dichiarati e costruiti in maniera diversa. Questo, a mio parere &amp;#232; fondamentale su una piattaforma come il CLR che, a differenza di Java,&amp;nbsp;ci offre la possibilit&amp;#224; di creare tipi valori customizzati (struct in C#, value class o value struct in C++/CLI). La scelta, inoltre, di distinguere gli operatori "gcnew" e "^"&amp;nbsp; da "new" e "*" &amp;#232; veramente ben pensata.
3.&amp;nbsp;I tre operatori per l'accesso a membro "::", "-&amp;gt;" e "." aggiungono chiarezza e auto-esplicativit&amp;#224; al codice.
4. Esistono i costruttori statici! Spesso rimpianti in Java e C# quando si deve inizializzare in maniera non banale i membri statici di una classe.
5. Come gi&amp;#224; fatto notare da Andrea&amp;nbsp;il compilatore C++/CLI espande&amp;nbsp;automaticamente le propriet&amp;#224; per le quali non sono dichiarati i metodi get/set (sostanzialmente inserisce un membro privato e l'implementazione banale di get/set).
6. La possibilit&amp;#224; di dicharare lo specificatore di accesso (public, private, protected, internal) su una serie di dichiarazioni successive ci&amp;nbsp;evita un po' di battitura e favorisce il raggruppamento dei membri (buona norma da molti utilizzata).
7. Viva la standard template library! Ora esiste una STL per il CLR... personalmente System::Collections non mi &amp;#232; mai piaciuta... 
More info and examples to come...
Inoltre il&amp;nbsp;team di cl.exe ha svolto un gran lavoro affinch&amp;#232; le stesse possibilit&amp;#224; di ottimizazzione che anni di esperienza hanno permesso di attribuire al compilatore C++ ora possano venire applicate anche al codice gestito. Naturalmente esistono delle differenze, dovute al fatto che il CLR &amp;#232; una macchina virtuale stack-based, ma il codice IL generato da cl.exe&amp;nbsp;&amp;#232; mediamente pi&amp;#249; performante di quello prodotto da csc.exe o vbc.exe. &lt;img src="http://blogs.ugidotnet.org/Andrew/aggbug/14495.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Sansottera</dc:creator>
            <guid>http://blogs.ugidotnet.org/Andrew/archive/2005/04/20/14495.aspx</guid>
            <pubDate>Wed, 20 Apr 2005 12:37:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/Andrew/archive/2005/04/20/14495.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/Andrew/comments/commentRss/14495.aspx</wfw:commentRss>
        </item>
        <item>
            <title>"What is Indigo?"</title>
            <link>http://blogs.ugidotnet.org/Andrew/archive/2005/04/11/13924.aspx</link>
            <description>Un'ottima introduzione (e dimostrazione) da parte di uno dei software architect che lo hanno ideato:
http://channel9.msdn.com/ShowPost.aspx?PostID=56397
42 minuti circa&lt;img src="http://blogs.ugidotnet.org/Andrew/aggbug/13924.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Sansottera</dc:creator>
            <guid>http://blogs.ugidotnet.org/Andrew/archive/2005/04/11/13924.aspx</guid>
            <pubDate>Mon, 11 Apr 2005 16:25:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/Andrew/archive/2005/04/11/13924.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/Andrew/comments/commentRss/13924.aspx</wfw:commentRss>
        </item>
        <item>
            <title>NUnit... MBUnit o CSUnit?</title>
            <link>http://blogs.ugidotnet.org/Andrew/archive/2005/04/10/13840.aspx</link>
            <description>Uso NUnit con discreta soddisfazione, ma mi chiedevo se qualcuno di voi abbia provato&amp;nbsp;i due progetti open-source "concorrenti".
Non ho molto tempo attualmente per provarli, qualcuno che li ha gi&amp;#224; usati sa darmi un parere?&lt;img src="http://blogs.ugidotnet.org/Andrew/aggbug/13840.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Sansottera</dc:creator>
            <guid>http://blogs.ugidotnet.org/Andrew/archive/2005/04/10/13840.aspx</guid>
            <pubDate>Sun, 10 Apr 2005 00:10:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/Andrew/archive/2005/04/10/13840.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/Andrew/comments/commentRss/13840.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Enterprise Library for Firebird 0.7.0</title>
            <link>http://blogs.ugidotnet.org/Andrew/archive/2005/04/05/13646.aspx</link>
            <description>
Ho effettuato qualche&amp;nbsp;piccola modifica al pacchetto. 
Grazie ad Alessandro Petrelli per le sue correzioni sullo script sql per la creazione del database 
Northwind.
Dal changelog:

  5th April 2005 - version 0.7.0 released
  
    &amp;nbsp;* License changed into LGPL&amp;nbsp;&amp;nbsp;* Cleaned up 
    "bin" and "obj" directories&amp;nbsp; from some files which were used during the 
    initial development process
    &amp;nbsp;* Minor changes to "NorthwindForFirebird.sql" (thanks to 
    Alessandro Petrelli)
    &amp;nbsp;* Minor changes to "Readme.txt"
    &amp;nbsp;* Added "Changelog.txt"&amp;nbsp;&amp;nbsp;* Version changed 
    into 0.7.0
La potete scaricare qui:http://digilander.libero.it/Syscall/Andrew.EnterpriseLibrary-20050405.zip
Se riesco in questi giorni farò richiesta presso SourceForge.

&lt;img src="http://blogs.ugidotnet.org/Andrew/aggbug/13646.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Sansottera</dc:creator>
            <guid>http://blogs.ugidotnet.org/Andrew/archive/2005/04/05/13646.aspx</guid>
            <pubDate>Tue, 05 Apr 2005 22:49:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/Andrew/archive/2005/04/05/13646.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/Andrew/comments/commentRss/13646.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>