<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>Web Log di Adrian Florea</title>
        <link>http://blogs.ugidotnet.org/adrian/Default.aspx</link>
        <description>"You know you've achieved perfection in design, not when you have nothing more to add, but when you have nothing more to take away." Antoine de Saint-Exupery</description>
        <language>it-IT</language>
        <copyright>Adrian Florea</copyright>
        <managingEditor>adrian_florea@yahoo.com</managingEditor>
        <generator>Subtext Version 1.9.5.176</generator>
        <image>
            <title>Web Log di Adrian Florea</title>
            <url>http://blogs.ugidotnet.org/images/RSS2Image.gif</url>
            <link>http://blogs.ugidotnet.org/adrian/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>How I got Started in Software Development</title>
            <category>Adrian</category>
            <category>Varie</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2008/07/15/how-i-got-started-in-software-development.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/rucka/archive/2008/07/15/93411.aspx"&gt;Taggato da Gianluca&lt;/a&gt;, ecco le mie risposte:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A quale età hai cominciato a programmare?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A 17 anni, nel lontano agosto del 1985&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Come hai cominciato a programmare?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A giugno di quell'anno (23 anni fa...), avevo vinto la fase provinciale di un concorso di comunicazioni scientifiche (sezione matematica) e come premio mi avevano mandato per 2-3 settimane al 1° campo nazionale di informatica in Romania, a &lt;a href="http://en.wikipedia.org/wiki/C%C3%A2mpulung"&gt;Câmpulung Muscel&lt;/a&gt;, dove ho avuto la fortuna di conoscere gli &lt;a href="http://ro.wikipedia.org/wiki/Lista_autorilor_de_manuale_de_matematica"&gt;autori dei miei manuali di matematica&lt;/a&gt;, Gheorghe Rizescu e Octavian Stănăşilă, poi &lt;a href="http://ro.wikipedia.org/wiki/Adrian_Petrescu"&gt;Adrian Petrescu&lt;/a&gt; che aveva &lt;em&gt;costruito&lt;/em&gt; proprio il computer &lt;a href="http://ro.wikipedia.org/wiki/AMIC"&gt;aMIC&lt;/a&gt; su cui ci insegnarono a programmare in BASIC, poi una ragazza bionda con degli enormi occhioni verdi di cui mi innamorai perdutamente ma ebbi il corraggio di dicchiararle subito il mio impossibile amore ;) Partecipai anche i prossimi anni, '86 e '87, al 2° e al 3° campo nazionale di informatica, stavolta a &lt;a href="http://it.wikipedia.org/wiki/T%C3%A2rgu_Mure%C5%9F"&gt;Târgu Mureş&lt;/a&gt; dove ho approfondito le mie conoscenze di BASIC ;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qual’è stato il tuo primo linguaggio di programmazione?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;BASIC&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qual’è stato il primo programma vero che hai scritto?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Il primo "vero" programma non ricordo ma il primo programma in assoluto non lo posso scordare: ero curioso di vedere come la funzione f(x)=(1+1/x)^x tende all'infinito verso il numero di Eulero e quindi le disegnai il grafico.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quali linguaggi hai usato da quando hai cominciato a programmare?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In ordine temporale: BASIC, FORTRAN, Turbo Pascal, C, dBase IV, Turbo Prolog, C++, Informix NewEra, Object Tcl, Delphi, Informix AppPage, JavaScript, Informix 4GL, Java, C#, VB.NET&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quando è stato il tuo primo vero lavoro da programmatore?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Direi nel 1996 (dal '92 al '96 ho fatto piu' matematica che informatica, come ricercatore)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Con il senno di poi, rifaresti lo stesso il programmatore? Ricominceresti a programmare?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Non so, probabilmente no.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Se ci fosse una cosa che hai imparato nella tua carriera e che vorresti dire ai giovani programmatori, cosa diresti?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Leggere prima la documentazione... ;)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Qual’è la cosa più divertente che hai programmato?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;type foo.cs &amp;gt; foo.cs&lt;br /&gt;
csc /t:library foo.cs&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Adesso è l’ora di taggare qualcun’altro...&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/luKa/"&gt;Luca Minudel&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://blogs.ugidotnet.org/rgm/"&gt;Gian Maria Ricci&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://blogs.ugidotnet.org/dotnet4ever/"&gt;Michele Bernardi&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://sharpreflections.wordpress.com/"&gt;Matteo Spreafico&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/93416.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2008/07/15/how-i-got-started-in-software-development.aspx</guid>
            <pubDate>Tue, 15 Jul 2008 19:09:01 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/93416.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2008/07/15/how-i-got-started-in-software-development.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/93416.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/93416.aspx</trackback:ping>
        </item>
        <item>
            <title>End tag required for HTML SCRIPT element</title>
            <category>Carillon .NET</category>
            <category>Varie</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2008/07/14/end-tag-required-for-html-script-element.aspx</link>
            <description>&lt;p&gt;Magari lo sanno tutti ma io ci ho perso mezz'ora per capire dove sta l'errore:&lt;/p&gt;
&lt;p&gt;&amp;lt;script type="text/javascript" src="foo.js"&lt;strong&gt;&lt;font color="#ff0000"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;e&lt;/p&gt;
&lt;p&gt;&amp;lt;script type="text/javascript" src="foo.js" &lt;strong&gt;&lt;font color="#ff0000"&gt;/&amp;gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;non sono uguali! &lt;em&gt;Su IE il tag esplicito di chiusura&lt;/em&gt; (la prima variante) &lt;em&gt;e' obbligatorio&lt;/em&gt;, mentre Firefox accetta tutte e due le varianti...&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/93398.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2008/07/14/end-tag-required-for-html-script-element.aspx</guid>
            <pubDate>Mon, 14 Jul 2008 14:23:53 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/93398.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2008/07/14/end-tag-required-for-html-script-element.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/93398.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/93398.aspx</trackback:ping>
        </item>
        <item>
            <title>I vostri migliori post, da oggi anche in rumeno</title>
            <category>Adrian</category>
            <category>Varie</category>
            <category>Voi</category>
            <category>GUISA</category>
            <category>RONUA</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2008/06/05/i-vostri-migliori-post-da-oggi-anche-in-rumeno.aspx</link>
            <description>&lt;p&gt;Oggi ho aperto il mio primo blog in rumeno, a &lt;a href="http://ronua.ro/CS/blogs/adrianf/default.aspx"&gt;questo indirizzo&lt;/a&gt; su RONUA. Per cominciare, ho deciso di tradurre in rumeno i post piu' interessanti che trovero' nelle varie &lt;a href="http://www.microsoft.com/italy/communities/elenco.mspx"&gt;community italiane&lt;/a&gt;, per far conoscere ai miei connazionali il grande spirito che ho conosciuto e mi avete regalato negli anni passati con voi. Ogni post sara' fornito ovviamente dal link al post originale, spero di avere il vostro consenso per la traduzione. E chissa', magari si stringono amicizie nuove, etc. Il blog su UGI non finisce qui, salvo completa mancanza di ispirazione :-)&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/92948.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2008/06/05/i-vostri-migliori-post-da-oggi-anche-in-rumeno.aspx</guid>
            <pubDate>Fri, 06 Jun 2008 10:32:14 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/92948.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2008/06/05/i-vostri-migliori-post-da-oggi-anche-in-rumeno.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/92948.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/92948.aspx</trackback:ping>
        </item>
        <item>
            <title>Lazy loading in una riga</title>
            <category>Pattern Dappertutto</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2008/05/28/lazy-loading-in-una-riga.aspx</link>
            <description>&lt;p&gt;Carino &lt;a href="http://realfiction.net/?q=node/157"&gt;questo&lt;/a&gt; modo proposto da &lt;a href="http://realfiction.net/"&gt;Frank Quednau&lt;/a&gt; di &lt;a href="http://blogs.ugidotnet.org/Markino/archive/2006/01/05/32476.aspx"&gt;implementare il lazy loading&lt;/a&gt; utilizzando l'operatore di null coalescing (ECMA-334, 14.12) e il fatto che &lt;em&gt;il risultato&lt;/em&gt; di un'assegnazione e' il valore assegnato all'operando sinistro (ECMA-334, 14.14.1):&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;internal sealed class&lt;/strong&gt; PersonProxy : Person&lt;br /&gt;
{&lt;br /&gt;
    &lt;strong&gt;public override&lt;/strong&gt; AddressCollection Addresses&lt;br /&gt;
    {&lt;br /&gt;
        &lt;strong&gt;get&lt;/strong&gt;&lt;br /&gt;
        {&lt;br /&gt;
            &lt;strong&gt;return base&lt;/strong&gt;.Addresses ?? (&lt;strong&gt;base&lt;/strong&gt;.Addresses = &lt;strong&gt;new&lt;/strong&gt; PersonDataMapper().GetAddressesByCode(&lt;strong&gt;this&lt;/strong&gt;.Code));&lt;br /&gt;
        }&lt;br /&gt;
        &lt;strong&gt;set&lt;/strong&gt;&lt;br /&gt;
        {&lt;br /&gt;
            &lt;strong&gt;base&lt;/strong&gt;.Addresses = &lt;strong&gt;value&lt;/strong&gt;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;A me sembra molto espressivo.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/92860.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2008/05/28/lazy-loading-in-una-riga.aspx</guid>
            <pubDate>Thu, 29 May 2008 10:04:38 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/92860.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2008/05/28/lazy-loading-in-una-riga.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/92860.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/92860.aspx</trackback:ping>
        </item>
        <item>
            <title>Quiz Sharp #70</title>
            <category>Quiz Sharp</category>
            <category>Test Sharp</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2008/05/18/quiz-sharp-70.aspx</link>
            <description>&lt;p&gt;Senza utilizzare stringhe, caratteri, numeri (&lt;em&gt;literals&lt;/em&gt;) o file esterni, si chiede di scrivere un programma in C# 3.0 che stampi a console la definizione compilabile di un tipo non vuoto.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/92726.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2008/05/18/quiz-sharp-70.aspx</guid>
            <pubDate>Sun, 18 May 2008 18:22:45 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/92726.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2008/05/18/quiz-sharp-70.aspx#feedback</comments>
            <slash:comments>12</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/92726.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/92726.aspx</trackback:ping>
        </item>
        <item>
            <title>Best practice Path.Combine</title>
            <category>Carillon .NET</category>
            <category>Pattern Dappertutto</category>
            <category>Bugs?</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2008/05/04/best-practice-path.combine.aspx</link>
            <description>&lt;p&gt;Se vogliamo che il nostro codice giri anche su Mono, dobbiamo utilizzare:&lt;/p&gt;
&lt;p&gt;Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "aaa.bbb")&lt;/p&gt;
&lt;p&gt;al posto di:&lt;/p&gt;
&lt;p&gt;AppDomain.CurrentDomain.BaseDirectory + "aaa.bbb"&lt;/p&gt;
&lt;p&gt;perche' su Mono, &lt;em&gt;BaseDirectory&lt;/em&gt; ritorna una stringa che non finisce in &lt;em&gt;Path.DirectorySeparatorChar&lt;/em&gt;, mentre su CLR si'. E questo va anche in generale, quando costruiamo il path da piu' pezzi, non solo nel caso della &lt;em&gt;BaseDirectory&lt;/em&gt;. Per esempio, chi utilizza &lt;a href="http://www.fyireporting.com/"&gt;fyiReporting RDL Project&lt;/a&gt; su Mono, dovrebbe modificare la riga 81 nel file Runtime/RdlEngineConfig.cs nei sorgenti del progetto e ricompilare, da:&lt;/p&gt;
&lt;p&gt;file = dir + "RdlEngineConfig.xml";&lt;/p&gt;
&lt;p&gt;a:&lt;/p&gt;
&lt;p&gt;file = Path.Combine(dir, "RdlEngineConfig.xml");&lt;/p&gt;
&lt;p&gt;perche' la stringa &lt;em&gt;dir&lt;/em&gt;, per come e' stata costruita, su CLR finisce in &lt;em&gt;Path.DirectorySeparatorChar&lt;/em&gt;, mentre su Mono no. In &lt;a href="http://www.amazon.com/Framework-Standard-Library-Annotated-Reference/dp/0321154894/"&gt;SLAR 1&lt;/a&gt; alla pagina 360, &lt;a href="http://joelmarcey.com/"&gt;Joel Marcey&lt;/a&gt; aggiunge questa nota sulla storia del metodo &lt;em&gt;Combine&lt;/em&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;em&gt;The&lt;/em&gt; Combine &lt;em&gt;method had an interesting ride in the standardization process. It was originally part of the &lt;/em&gt;Path &lt;em&gt;class, then removed because it was thought to be too platform-specific, then added back because it was decided it was not any more platform-specific than any of the other methods in this class.&lt;/em&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/92512.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2008/05/04/best-practice-path.combine.aspx</guid>
            <pubDate>Mon, 05 May 2008 09:44:32 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/92512.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2008/05/04/best-practice-path.combine.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/92512.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/92512.aspx</trackback:ping>
        </item>
        <item>
            <title>Un'API generico a provider per i metadata dei vari ORM</title>
            <category>Carillon .NET</category>
            <category>Pattern Dappertutto</category>
            <category>VSX</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2008/05/03/unapi-generico-a-provider-per-i-metadata-dei-vari-orm.aspx</link>
            <description>&lt;p&gt;Via &lt;a href="http://weblogs.asp.net/fbouma/archive/2008/05/01/dynamic-data-and-3rd-party-o-r-mappers-is-a-fact.aspx"&gt;questo post&lt;/a&gt; di &lt;a href="http://weblogs.asp.net/fbouma/"&gt;Frans Bouma&lt;/a&gt; ho scoperto sotto il namespace &lt;strong&gt;System.Web.DynamicData.ModelProviders&lt;/strong&gt; dell'assembly &lt;strong&gt;System.Web.DynamicData.dll&lt;/strong&gt; che arriva con l'ultima release della preview di &lt;a href="http://code.msdn.microsoft.com/dynamicdata"&gt;ASP.NET Dynamic Data&lt;/a&gt;, un'API generico composto da 4 provider per i metadata dei vari ORM (non solo Microsoft): &lt;strong&gt;DataModelProvider&lt;/strong&gt;, &lt;strong&gt;TableProvider&lt;/strong&gt;, &lt;strong&gt;ColumnProvider&lt;/strong&gt; ed &lt;strong&gt;AssociationProvider&lt;/strong&gt;. Questo unifica in buona misura le varie API che espongono i metadata degli ORM, per esempio &lt;strong&gt;MetaTable&lt;/strong&gt;, &lt;strong&gt;MetaDataMember&lt;/strong&gt;, &lt;strong&gt;MetaAssociation&lt;/strong&gt; nel caso di LINQ to SQL, oppure quella piu' complessa dell'Entity Framework: &lt;strong&gt;EntitySet&lt;/strong&gt;, &lt;strong&gt;EdmMember&lt;/strong&gt;, &lt;strong&gt;NavigationProperty&lt;/strong&gt;, etc. Frans ha gia' scritto un &lt;em&gt;model provider&lt;/em&gt; per il suo &lt;a href="http://www.llblgen.com/"&gt;LLBLGen Pro&lt;/a&gt;, sarebbe bellissimo averne uno anche per &lt;a href="http://www.nhibernate.org/"&gt;NHibernate&lt;/a&gt;. E poi mi piacerebbe in futuro vedere questa API staccata dal ASP.NET Dynamics Data con cui non dovrebbe avere tanto in comune.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/92497.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2008/05/03/unapi-generico-a-provider-per-i-metadata-dei-vari-orm.aspx</guid>
            <pubDate>Sat, 03 May 2008 13:53:11 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/92497.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2008/05/03/unapi-generico-a-provider-per-i-metadata-dei-vari-orm.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/92497.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/92497.aspx</trackback:ping>
        </item>
        <item>
            <title>RONUA Galati</title>
            <category>Adrian</category>
            <category>Varie</category>
            <category>RONUA</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2008/04/16/92253.aspx</link>
            <description>&lt;p&gt;E' dall'anno scorso, da quando sono tornato a casa in Romania, che sogno la costituzione di una filiale locale dello user group rumeno di .NET, &lt;a href="http://ronua.ro/CS/"&gt;RONUA&lt;/a&gt;. Ed ecco che oggi, il presidente di RONUA, &lt;a href="http://www.aurelian.ro/"&gt;Aurelian Popa&lt;/a&gt;, mi incarica con l'organizzazione della &lt;a href="http://ronua.ro/CS/forums/130/ShowForum.aspx"&gt;nuova community&lt;/a&gt;. Lo spazio per gli workshop sara' messo a disposizione grazie all'entusiasmo e all'appoggio di Catalin Arama nell'attrezzatissima sala conferenze del Parco Software di Galati. Una settantina di libri personali li metto a disposizione io per creare una piccola libreria .NET (nella stanza 408 dove &lt;a href="http://www.nexida.com/"&gt;lavoro&lt;/a&gt; presso lo stesso Parco Software). Sto pensando che potrei trovare degli sponsor per pagare alloggio e trasporto fino in Romania se qualcuno di voi avra' voglia di tenere una sessione .NET qui in Romania, nella mia &lt;a href="http://en.wikipedia.org/wiki/Gala%C5%A3i"&gt;citta'&lt;/a&gt; sul Danubio, gemellata con Ancona, Brindisi, Jesi e Salerno :-) Vi terro' aggiornati sugli sviluppi della nuova community.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/92253.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2008/04/16/92253.aspx</guid>
            <pubDate>Thu, 17 Apr 2008 08:49:22 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/92253.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2008/04/16/92253.aspx#feedback</comments>
            <slash:comments>9</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/92253.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/92253.aspx</trackback:ping>
        </item>
        <item>
            <title>Quiz Sharp #69</title>
            <category>Quiz Sharp</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2008/04/08/92115.aspx</link>
            <description>Scrivete una proprieta' in cui il body del getter non contenga &lt;strong&gt;return&lt;/strong&gt; o &lt;strong&gt;throw&lt;/strong&gt;.&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/92115.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2008/04/08/92115.aspx</guid>
            <pubDate>Tue, 08 Apr 2008 20:22:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/92115.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2008/04/08/92115.aspx#feedback</comments>
            <slash:comments>9</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/92115.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/92115.aspx</trackback:ping>
        </item>
        <item>
            <title>Brian Grunkemeyer sulla storia del TypeCode e dell'interfaccia IConvertible</title>
            <category>Un po' di storia</category>
            <category>Carillon .NET</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2008/03/17/91755.aspx</link>
            <description>&lt;p&gt;Visto l'interesse che ha suscitato &lt;a href="http://blogs.ugidotnet.org/adrian/archive/2008/03/12/91669.aspx"&gt;l'ultimo post&lt;/a&gt;, ho scritto a &lt;a href="http://blogs.msdn.com/brada"&gt;Brad Abrams&lt;/a&gt; chiedendo conferma per la mia supposizione e dettagli sulla storia dell'interfaccia IValue, lui mi risponde subito indirizzandomi a &lt;a href="http://blogs.msdn.com/bclteam/"&gt;Brian Grunkemeyer&lt;/a&gt; e stamattina trovo nella mia casella email, scritto da Brian, questo splendido pezzo della storia di .NET:&lt;/p&gt; &lt;blockquote&gt;
&lt;p&gt;This is a good question. I was digging through the history of this file to see if I could figure out what happened, and it’s not clear. We’ve had this “hole” in the TypeCode enum since October of 2000, and I can’t find an older set of bits. But, I’m sure that comment in IConvertible is right – this used to be TimeSpan. For TimeSpan, it’s possible we thought it would be interesting for a while, then we realized that frankly not that many people need to convert a Decimal to a TimeSpan, then removed it.&lt;/p&gt;
&lt;p&gt;You might ask why we didn’t “fix” the enum when we removed whichever of these values we had originally added. It turns out that whenever we have a breaking change internally, we need to recompile all the code that might possibly depend on the removed or changed public surface area. For us, that would mean rebuilding everything that might have referred to TypeCode.String, whose value would have changed from 18 to 17. While we do go through that process internally in DevDiv, it is costly &amp;amp; painful for us. Back then with some underdeveloped internal processes, it usually took 2 weeks, then even longer if your change requires a rebuilt compiler to be checked in as a new “safe” build of a compiler. Back in 2000, we were racing to ship as soon as possible (even though we didn’t ship for another year or two), so we wanted to limit churn like this. It’s sometimes easier to not deal with that level of churn in the product.&lt;/p&gt;
&lt;p&gt;For your other question about IValue, that was the original name for IConvertible. We exposed a Variant type to match OLE Automation’s VARIANT type on the native side, for COM Interop reasons. The VB team actually was thinking that Variant should be conceptually the root of their object hierarchy (at least in terms of how types were exposed in VB 7), but that seemed a little silly. Fortunately, Anders Hejlsberg convinced them to use Object instead and we’d expose IConvertible on the base data types to allow VB users to easily change from one data type to another. So we marked Variant internal &amp;amp; we only use it in a handful of places internally for COM-related functionality.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;Grazie ragazzi!&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/91755.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2008/03/17/91755.aspx</guid>
            <pubDate>Tue, 18 Mar 2008 06:24:33 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/91755.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2008/03/17/91755.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/91755.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/91755.aspx</trackback:ping>
        </item>
        <item>
            <title>Sull'enum TypeCode e sull'interfaccia fantoma IValue</title>
            <category>Un po' di storia</category>
            <category>Carillon .NET</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2008/03/12/91669.aspx</link>
            <description>&lt;p&gt;Oggi &lt;a href="http://blogs.ugidotnet.org/raffaele/"&gt;Raf&lt;/a&gt; sul messenger mi chiede se conosco un modo piu' diretto per capire se un tipo sia &lt;a href="http://msdn2.microsoft.com/en-us/library/system.type.isprimitive.aspx"&gt;primitivo&lt;/a&gt; oppure &lt;strong&gt;String&lt;/strong&gt; o &lt;strong&gt;DateTime&lt;/strong&gt; (questo per evitare degli &lt;em&gt;if&lt;/em&gt;...). Pensandoci un po', arrivo a questa soluzione:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;(int)Type.GetTypeCode(type) &amp;gt; 2&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;dove &lt;em&gt;type&lt;/em&gt; e' il tipo in causa. Lui prova e mi dice che va benissimo mentre io gia' sto pensando di bloggare questa riga di codice :-) L'enum &lt;a href="http://msdn2.microsoft.com/en-us/library/system.typecode.aspx"&gt;TypeCode&lt;/a&gt; infatti, contiene nella sua lista di valori maggiori a 2 tutti i 12 tipi &lt;strong&gt;primitivi&lt;/strong&gt; piu' il &lt;strong&gt;DateTime&lt;/strong&gt; e lo &lt;strong&gt;String&lt;/strong&gt;, proprio quello che voleva Raf. A questo punto gli chiedo come denominare questa categoria di tipi? Primitivi non sono, &lt;em&gt;built-in&lt;/em&gt; (&lt;a href="http://www.ecma-international.org/publications/standards/Ecma-335.htm"&gt;ECMA-335&lt;/a&gt;, &lt;strong&gt;Partition I&lt;/strong&gt;, &lt;strong&gt;8.2.2&lt;/strong&gt;) nemmeno, boh... &lt;em&gt;fondamentali&lt;/em&gt;? Qui Raf si ricorda che "&lt;em&gt;in una alpha erano refclass adesso non piu'&lt;/em&gt;". E poi fa questa osservazione giusta:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Raffaele MVP says (4:45 PM):&lt;/strong&gt;&lt;br /&gt;
io comunque metterei &amp;gt;2 e &amp;lt;18&lt;br /&gt;
non si sa mai che aggiungano altre enum in futuro&lt;br /&gt;
&lt;strong&gt;&amp;lt;drian says (4:46 PM):&lt;/strong&gt;&lt;br /&gt;
hai visto che manca 17?&lt;br /&gt;
&lt;strong&gt;Raffaele MVP says (4:46 PM):&lt;/strong&gt;&lt;br /&gt;
non ci ho fatto caso&lt;br /&gt;
&lt;strong&gt;&amp;lt;drian says (4:47 PM):&lt;/strong&gt;&lt;br /&gt;
in questo caso, dovrei fare anche != 17, perche' il 17 per adesso manca&lt;br /&gt;
e diventa un po' una schifezza&lt;br /&gt;
&lt;strong&gt;Raffaele MVP says (4:48 PM):&lt;/strong&gt;&lt;br /&gt;
a questo punto puoi legarlo ad una versione specifica di quell'assembly ma poi non funziona più automaticamente&lt;br /&gt;
&lt;strong&gt;Raffaele MVP says (4:49 PM):&lt;/strong&gt;&lt;br /&gt;
o ancora metterlo typesafe&lt;br /&gt;
&amp;gt;=boolean &amp;lt;=string&lt;br /&gt;
ma c'è sempre il 17 a rompere &lt;/p&gt;
&lt;p&gt;Spulciando poi i sorgenti di &lt;a href="http://msdn.microsoft.com/net/sscli/"&gt;Rotor&lt;/a&gt;, trovo questo commento nel file dell'interfaccia &lt;strong&gt;System.IConvertible&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;font color="#339966"&gt;// The IValue interface represents an object that contains a value. This&lt;br /&gt;
// interface is implemented by the following types in the System namespace:&lt;br /&gt;
// &lt;strong&gt;Boolean&lt;/strong&gt;, &lt;strong&gt;Char&lt;/strong&gt;, &lt;strong&gt;SByte&lt;/strong&gt;, &lt;strong&gt;Byte&lt;/strong&gt;, &lt;strong&gt;Int16&lt;/strong&gt;, &lt;strong&gt;UInt16&lt;/strong&gt;, &lt;strong&gt;Int32&lt;/strong&gt;, &lt;strong&gt;UInt32&lt;/strong&gt;, &lt;strong&gt;Int64&lt;/strong&gt;, &lt;strong&gt;UInt64&lt;/strong&gt;,&lt;br /&gt;
// &lt;strong&gt;Single&lt;/strong&gt;, &lt;strong&gt;Double&lt;/strong&gt;, &lt;strong&gt;Decimal&lt;/strong&gt;, &lt;strong&gt;DateTime&lt;/strong&gt;, &lt;font color="#ff0000"&gt;&lt;strong&gt;TimeSpan&lt;/strong&gt;&lt;/font&gt;, and &lt;strong&gt;String&lt;/strong&gt;. The interface may&lt;br /&gt;
// be implemented by other types that are to be considered values.&lt;/font&gt; &lt;/p&gt;
&lt;p&gt;Cosa notate? Esattamente l'elenco di tipi che interessava Raf, nell'ordine di &lt;strong&gt;TypeCode&lt;/strong&gt; e... in piu' il &lt;strong&gt;&lt;font color="#ff0000"&gt;TimeSpan&lt;/font&gt;&lt;/strong&gt; tra il &lt;strong&gt;DateTime&lt;/strong&gt; = 16 e lo &lt;strong&gt;String&lt;/strong&gt; = 18, cioe' corrispondente proprio al &lt;strong&gt;&lt;font color="#ff0000"&gt;17&lt;/font&gt;&lt;/strong&gt; che mancava! Questa interfaccia, &lt;strong&gt;IValue&lt;/strong&gt;, non esiste piu' nel framework ma alcuni commenti su varie implementazioni del metodo &lt;strong&gt;GetTypeCode()&lt;/strong&gt; sono rimasti come:&lt;/p&gt;
&lt;p&gt;&lt;font color="#339966"&gt;// IValue implementation&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;perche', probabilmente, conteneva questo metodo &lt;strong&gt;GetTypeCode&lt;/strong&gt;. Questa ormai e' "&lt;em&gt;archeologia&lt;/em&gt;" di .NET! :-) E non e' tutto. Guardate nei commenti dell'enum &lt;strong&gt;System.TypeCode&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;font color="#339966"&gt;// Note that when an object has a given TypeCode, there is no guarantee that&lt;br /&gt;
// the object is an instance of the corresponding System.XXX value class. For&lt;br /&gt;
// example, &lt;strong&gt;an object with the type code TypeCode.Int32 might actually be an&lt;/strong&gt;&lt;br /&gt;
// &lt;strong&gt;instance of a nullable 32-bit integer type&lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;
&lt;p&gt;Questo comportamento non e' piu' vero, perche' il valore di &lt;strong&gt;Type.GetTypeCode(typeof(&lt;font color="#ff0000"&gt;int?&lt;/font&gt;))&lt;/strong&gt; e' &lt;strong&gt;TypeCode.&lt;font color="#ff0000"&gt;Object&lt;/font&gt;&lt;/strong&gt;, mentre il valore di &lt;strong&gt;Type.GetTypeCode(typeof(int))&lt;/strong&gt; e' &lt;strong&gt;TypeCode.Int32&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;Dopo una discussione tecnica con Raf, direi che sia impossibile non cliccare "&lt;strong&gt;New Post&lt;/strong&gt;"! :-)&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/91669.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2008/03/12/91669.aspx</guid>
            <pubDate>Wed, 12 Mar 2008 17:49:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/91669.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2008/03/12/91669.aspx#feedback</comments>
            <slash:comments>9</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/91669.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/91669.aspx</trackback:ping>
        </item>
        <item>
            <title>Un DSL per i mapping O/R?</title>
            <category>VSX</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2008/03/03/91491.aspx</link>
            <description>Guardando in questi giorni &lt;a href="http://tools.hibernate.org/"&gt;Hibernate Tools&lt;/a&gt;, mi e' piaciuta molto l'idea che sta alla base della la sua architettura: il mapping viene rappresentato da un'istanza del &lt;em&gt;metamodello&lt;/em&gt; di Hibernate (classe &lt;strong&gt;org.hibernate.cfg.Configuration&lt;/strong&gt; o derivate, equivalente di &lt;strong&gt;NHibernate.Cfg.Configuration&lt;/strong&gt;) e da questo &lt;em&gt;modello&lt;/em&gt; vengono generati i vari artefatti tramite cosiddetti &lt;em&gt;exporter&lt;/em&gt; (per esempio &lt;strong&gt;hbm2java&lt;/strong&gt;, &lt;strong&gt;hbm2ddl&lt;/strong&gt;, &lt;strong&gt;hbm2hbmxml&lt;/strong&gt;, etc), che non sono altro che classi che derivano da &lt;strong&gt;org.hibernate.tool.hbm2x.GenericExporter&lt;/strong&gt; e che, insieme a dei template FreeMarker, definiscono in modo straordinariamente flessibile la parte di generazione codice/artefatti. Quindi, al posto della &lt;strong&gt;PO&lt;font color="#ff0000"&gt;J&lt;/font&gt;OExporter&lt;/strong&gt; potremmo avere, perche' no, anche una &lt;strong&gt;PO&lt;font color="#ff0000"&gt;C&lt;/font&gt;OExporter&lt;/strong&gt; per il domain model C#. Sarebbe interessante replicare in NHibernate un'infrastruttura simile, soprattutto adesso quando &lt;a href="http://blogs.msdn.com/garethj/archive/2008/01/31/fun-use-of-t4-to-generate-strongly-typed-web-navigation.aspx"&gt;la parte di generazione codice via template T4 si trova gia' inclusa in VS2008&lt;/a&gt;. E poi, se tutto questo viene generato da un'istanza di &lt;strong&gt;Configuration&lt;/strong&gt;, ci vuole solo un passo per creare un DSL grafico (con l'immenso aiuto di &lt;a href="http://msdn2.microsoft.com/en-us/library/bb126235.aspx"&gt;DSL Tools&lt;/a&gt;) che rappresenti il mapping (N)Hibernate. E un po' quello che hanno fatto in Java con, per esempio, &lt;a href="http://www.exadel.com/exadelstudio/help/#orm2"&gt;Exadel Studio Pro&lt;/a&gt;, diventato adesso parte di &lt;a href="http://www.jboss.com/products/devstudio"&gt;Jboss Developer Studio&lt;/a&gt;. Ma poi, i concetti di mapping sono quasi independenti dagli engine e quindi, perche' non pensare a un tool visuale capace di risolvere la parte mapping per piu' ORM?&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/91491.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2008/03/03/91491.aspx</guid>
            <pubDate>Tue, 04 Mar 2008 11:50:22 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/91491.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2008/03/03/91491.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/91491.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/91491.aspx</trackback:ping>
        </item>
        <item>
            <title>L'OR Designer e' stato scritto con DSL Tools</title>
            <category>Carillon .NET</category>
            <category>VSX</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2008/01/21/90790.aspx</link>
            <description>Lo sapevate che l'Object Relational Designer e la parte di generazione di codice per le classi LINQ to SQL in VS2008 sono state scritte utilizzando &lt;a href="http://www.microsoft.com/vstudio/dsltools"&gt;Microsoft DSL Tools&lt;/a&gt; che fa parte di &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=51A5C65B-C020-4E08-8AC0-3EB9C06996F4&amp;amp;displaylang=en"&gt;VS SDK&lt;/a&gt;? - l'ho scoperto tramite il Reflector mentre &lt;a href="http://www.domainspecificdevelopment.com/"&gt;studiavo&lt;/a&gt; l'API di questo potentissimo framework che e' DSL Tools: tra le classi che derivano da &lt;strong&gt;Microsoft.VisualStudio.Modeling.ModelElement&lt;/strong&gt;, classe fondamentale per la rappresentazione degli elementi di un domain model, si trovano anche le classi internal dell'OR Designer. Questo dovrebbe dare piu' fiduccia a chi inizia o valuta di &lt;a href="http://msdn.com/vsx"&gt;estendere Visual Studio&lt;/a&gt; per un certo DSL utilizzando DSL Tools! - parti complesse del VS stesso iniziano ad essere sviluppate con questo framework.&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/90790.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2008/01/21/90790.aspx</guid>
            <pubDate>Mon, 21 Jan 2008 14:29:06 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/90790.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2008/01/21/90790.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/90790.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/90790.aspx</trackback:ping>
        </item>
        <item>
            <title>code and solutions (and a resume)</title>
            <category>Quiz Sharp</category>
            <category>Adrian</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2007/12/11/90219.aspx</link>
            <description>&lt;p&gt;Via &lt;a href="http://infoarena.ro/blog/olimpicul-de-la-facebook"&gt;questo post&lt;/a&gt; del mio connazionale &lt;a href="http://infoarena.ro/blog"&gt;Cosmin Negruseri&lt;/a&gt;, sono venuto a conoscenza di questa idea tanto bella quanto semplice ed efficace: proprio nella &lt;a href="http://www.facebook.com/jobs/index.php"&gt;pagina Jobs&lt;/a&gt; di Facebook c'e' una &lt;a href="http://www.facebook.com/jobs_puzzles/"&gt;sezione di programming puzzles&lt;/a&gt; belli tosti, provateli per credere. Ogni problema finisce coll'invito:&lt;/p&gt;
&lt;blockquote&gt;Please send your code and solutions (and a resume) to { (0xFACEB00C &amp;gt;&amp;gt; 2) in decimal format } @ facebook.com&lt;/blockquote&gt;
&lt;p&gt;Notate "&lt;em&gt;and a resume&lt;/em&gt;" messo tra parentesi, per non dire dell'indirizzo email veramente originale ;) Complimenti!&lt;/p&gt;
&lt;p&gt;(Oggi faccio gli 'anta ;) Non si scherza piu'!)&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/90219.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2007/12/11/90219.aspx</guid>
            <pubDate>Tue, 11 Dec 2007 13:38:41 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/90219.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2007/12/11/90219.aspx#feedback</comments>
            <slash:comments>14</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/90219.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/90219.aspx</trackback:ping>
        </item>
        <item>
            <title>Il pattern Decorator e la decorazione con un extension method generico</title>
            <category>Pattern Dappertutto</category>
            <category>GUISA</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2007/11/29/90017.aspx</link>
            <description>&lt;p&gt;Stamattina, al corso che sto tenendo di architettura base, ho presentato ai ragazzi il classico pattern &lt;em&gt;Decorator&lt;/em&gt; per servirci poi nell'implementare i vari servizi di validazione, logging, caching, etc., come decoratori di un repository, ispirato da &lt;a href="http://www.ayende.com/Blog/archive/7598.aspx"&gt;questo post&lt;/a&gt; di Ayende. Uno di loro mi ha chiesto se si poteva scrivere il corpo della &lt;strong&gt;CreateComponent&lt;/strong&gt; in modo ancora piu' &lt;em&gt;usabile&lt;/em&gt;. E mi e' venuta l'idea di utilizzare un extension method generico fluente, tanto per introdurli un po' anche nel mondo di C# 3.0&lt;/p&gt;
&lt;p&gt;Partiamo dall'implementazione standard del pattern:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;using&lt;/strong&gt; System;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;interface&lt;/strong&gt; IComponent {&lt;br /&gt;
    &lt;strong&gt;void&lt;/strong&gt; Operation();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;class&lt;/strong&gt; ConcreteComponent : IComponent {&lt;br /&gt;
    &lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;void&lt;/strong&gt; Operation() {&lt;br /&gt;
        Console.WriteLine("ConcreteComponent");&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;abstract&lt;/strong&gt; &lt;strong&gt;class&lt;/strong&gt; Decorator : IComponent {&lt;br /&gt;
    &lt;strong&gt;private&lt;/strong&gt; &lt;strong&gt;readonly&lt;/strong&gt; IComponent component;&lt;br /&gt;
&lt;br /&gt;
    &lt;strong&gt;protected&lt;/strong&gt; Decorator(IComponent component) {&lt;br /&gt;
        &lt;strong&gt;if&lt;/strong&gt; (component == &lt;strong&gt;null&lt;/strong&gt;) &lt;strong&gt;throw&lt;/strong&gt; &lt;strong&gt;new&lt;/strong&gt; ArgumentNullException("component");&lt;br /&gt;
        &lt;strong&gt;this&lt;/strong&gt;.component = component;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;virtual&lt;/strong&gt; &lt;strong&gt;void&lt;/strong&gt; Operation() {&lt;br /&gt;
        &lt;strong&gt;this&lt;/strong&gt;.component.Operation();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;class&lt;/strong&gt; ConcreteDecoratorA : Decorator {&lt;br /&gt;
    &lt;strong&gt;public&lt;/strong&gt; ConcreteDecoratorA(IComponent component) : &lt;strong&gt;base&lt;/strong&gt;(component) { }&lt;br /&gt;
&lt;br /&gt;
    &lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;override&lt;/strong&gt; &lt;strong&gt;void&lt;/strong&gt; Operation() {&lt;br /&gt;
        Console.WriteLine("ConcreteDecoratorA");&lt;br /&gt;
        &lt;strong&gt;base&lt;/strong&gt;.Operation();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;class&lt;/strong&gt; ConcreteDecoratorB : Decorator {&lt;br /&gt;
    &lt;strong&gt;public&lt;/strong&gt; ConcreteDecoratorB(IComponent component) : &lt;strong&gt;base&lt;/strong&gt;(component) { }&lt;br /&gt;
&lt;br /&gt;
    &lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;override&lt;/strong&gt; &lt;strong&gt;void&lt;/strong&gt; Operation() {&lt;br /&gt;
        Console.WriteLine("ConcreteDecoratorB");&lt;br /&gt;
        &lt;strong&gt;base&lt;/strong&gt;.Operation();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;class&lt;/strong&gt; Program {&lt;br /&gt;
    &lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;static&lt;/strong&gt; IComponent CreateComponent() {&lt;br /&gt;
        &lt;font color="#ff0000"&gt;&lt;strong&gt;return&lt;/strong&gt; &lt;br /&gt;
            &lt;strong&gt;new&lt;/strong&gt; ConcreteDecoratorB(&lt;br /&gt;
            &lt;strong&gt;new&lt;/strong&gt; ConcreteDecoratorA(&lt;br /&gt;
            &lt;strong&gt;new&lt;/strong&gt; ConcreteComponent()));&lt;/font&gt;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    &lt;strong&gt;static&lt;/strong&gt; &lt;strong&gt;void&lt;/strong&gt; Main() {&lt;br /&gt;
        IComponent component = CreateComponent();&lt;br /&gt;
        component.Operation();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;Questo snippet quindi stampa:&lt;/p&gt;
&lt;p&gt;ConcreteDecoratorB&lt;br /&gt;
ConcreteDecoratorA&lt;br /&gt;
ConcreteComponent&lt;/p&gt;
&lt;p&gt;a console. L'idea per modificare il metodo &lt;strong&gt;CreateComponent&lt;/strong&gt; e' semplice: se definiamo una classe statica &lt;strong&gt;ComponentExtension&lt;/strong&gt; contenente un'extension method generico come di seguito:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;static&lt;/strong&gt; &lt;strong&gt;class&lt;/strong&gt; ComponentExtension {&lt;br /&gt;
    &lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;static&lt;/strong&gt; Decorator DecorateWith&amp;lt;T&amp;gt;(&lt;strong&gt;this&lt;/strong&gt; IComponent component) &lt;strong&gt;where&lt;/strong&gt; T : Decorator {&lt;br /&gt;
        &lt;strong&gt;return&lt;/strong&gt; (T)Activator.CreateInstance(&lt;strong&gt;typeof&lt;/strong&gt;(T), component);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;il metodo &lt;strong&gt;CreateComponent&lt;/strong&gt; diventa:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;public&lt;/strong&gt; &lt;strong&gt;static&lt;/strong&gt; IComponent CreateComponent() {&lt;br /&gt;
    &lt;font color="#ff0000"&gt;&lt;strong&gt;return&lt;/strong&gt; &lt;strong&gt;new&lt;/strong&gt; ConcreteComponent()&lt;br /&gt;
            .DecorateWith&amp;lt;ConcreteDecoratorA&amp;gt;()&lt;br /&gt;
            .DecorateWith&amp;lt;ConcreteDecoratorB&amp;gt;();&lt;/font&gt;&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;che, a mio parere, e' piu' espressivo. Che ne dite?&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/90017.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2007/11/29/90017.aspx</guid>
            <pubDate>Thu, 29 Nov 2007 14:47:56 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/90017.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2007/11/29/90017.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/90017.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/90017.aspx</trackback:ping>
        </item>
        <item>
            <title>Quiz Sharp #68 [con smiley]</title>
            <category>Quiz Sharp</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2007/11/18/89780.aspx</link>
            <description>&lt;p&gt;Questo snippet (di cui manca un pezzo) si esegue in Visual Studio premendo F5 e rimane fermo al breakpoint definito nel codice del metodo &lt;em&gt;Main&lt;/em&gt;. Muovendo poi lentamente il mouse sulla finestra dello snippet in Visual Studio, si nota che a volte viene stampato uno smiley &lt;strong&gt;:-)&lt;/strong&gt; a console.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;class&lt;/strong&gt; Quiz {&lt;br /&gt;
    // da completare&lt;br /&gt;
    &lt;strong&gt;static&lt;/strong&gt; &lt;strong&gt;void&lt;/strong&gt; Main() {&lt;br /&gt;
        System.Diagnostics.Debugger.Break(); // breakpoint&lt;br /&gt;
    }&lt;br /&gt;
} &lt;/p&gt;
&lt;p&gt;Si chiede di completare il codice che manca.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/89780.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2007/11/18/89780.aspx</guid>
            <pubDate>Sun, 18 Nov 2007 22:12:53 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/89780.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2007/11/18/89780.aspx#feedback</comments>
            <slash:comments>6</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/89780.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/89780.aspx</trackback:ping>
        </item>
        <item>
            <title>Quiz #67 [triple wrapping exceptions]</title>
            <category>Quiz Sharp</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2007/11/03/89396.aspx</link>
            <description>&lt;p&gt;Senza utilizzare alcun &lt;strong&gt;throw&lt;/strong&gt;, completate il seguente snippet in tal modo che il &lt;strong&gt;catch&lt;/strong&gt; stampi &lt;strong&gt;Ciao!&lt;/strong&gt; a console e tutte e tre le inner exception devono essere di tipi diversi:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;using&lt;/strong&gt; System;&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;class&lt;/strong&gt; Quiz {&lt;br /&gt;
    // ... da completare&lt;br /&gt;
&lt;br /&gt;
    &lt;strong&gt;static&lt;/strong&gt; &lt;strong&gt;void&lt;/strong&gt; Main() {&lt;br /&gt;
        &lt;strong&gt;try&lt;/strong&gt; {&lt;br /&gt;
            // ... da completare&lt;br /&gt;
        }&lt;br /&gt;
        &lt;strong&gt;catch&lt;/strong&gt; (Exception e) {&lt;br /&gt;
            &lt;strong&gt;if&lt;/strong&gt;(&lt;font face="Arial"&gt;e.InnerException != &lt;strong&gt;null&lt;/strong&gt; &amp;amp;&amp;amp; e.InnerException.InnerException != &lt;strong&gt;null&lt;/strong&gt; &amp;amp;&amp;amp; e.InnerException.InnerException.InnerException != &lt;strong&gt;null&lt;/strong&gt;&lt;/font&gt;) {&lt;br /&gt;
                Console.WriteLine("Ciao!");&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
} &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/89396.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2007/11/03/89396.aspx</guid>
            <pubDate>Sun, 04 Nov 2007 10:42:23 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/89396.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2007/11/03/89396.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/89396.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/89396.aspx</trackback:ping>
        </item>
        <item>
            <title>Collecting Parameter e Fluent Interface - due pattern simmetrici</title>
            <category>Pattern Dappertutto</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2007/10/29/89297.aspx</link>
            <description>&lt;p&gt;Ho notato oggi delle simmetrie tra questi due pattern: il pattern di refactoring, &lt;a href="http://www.industriallogic.com/xp/refactoring/accumulationToCollection.html"&gt;CollectingParameter&lt;/a&gt;, che accumula informazioni nell'istanza del parametro (&lt;strong&gt;input&lt;/strong&gt;) e il pattern &lt;a href="http://martinfowler.com/bliki/FluentInterface.html"&gt;FluentInterface&lt;/a&gt;, che accumula informazioni nel valore di ritorno (&lt;strong&gt;output&lt;/strong&gt;). Il tipo del parametro e' &lt;strong&gt;diverso&lt;/strong&gt; dal tipo che contiene i metodi nel &lt;em&gt;CollectingParameter&lt;/em&gt;, mentre il tipo del valore di ritorno e &lt;strong&gt;identico&lt;/strong&gt; al tipo che contiene i metodi nel &lt;em&gt;FluentInterface&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Esempi di altre simmetrie nei pattern trovate nel nostro &lt;a href="http://wiki.ugidotnet.org/default.aspx/UGIdotNETWiki/DesignPatternSimmetrici.html"&gt;wiki&lt;/a&gt;, raccolti da &lt;a href="http://blogs.ugidotnet.org/luKa/"&gt;Luca&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/89297.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2007/10/29/89297.aspx</guid>
            <pubDate>Tue, 30 Oct 2007 11:52:01 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/89297.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2007/10/29/89297.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/89297.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/89297.aspx</trackback:ping>
        </item>
        <item>
            <title>raise accessor in C++/CLI</title>
            <category>Carillon .NET</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2007/10/08/88834.aspx</link>
            <description>&lt;p&gt;Due anni e mezzo fa, parlavo in &lt;a href="http://blogs.ugidotnet.org/adrian/archive/2005/05/23/17175.aspx"&gt;questo post&lt;/a&gt;, di tre eventi all'interno delle classi del framework, tutti e tre nell'assembly &lt;em&gt;Microsoft.VisualBasic.dll&lt;/em&gt;, provvisti non solo dei classici accessor &lt;strong&gt;add&lt;/strong&gt; e &lt;strong&gt;remove&lt;/strong&gt;, ma anche di &lt;strong&gt;raise&lt;/strong&gt; (&lt;strong&gt;.fire&lt;/strong&gt; in IL), accessor che non esiste ancora in C# e finivo il post chiedendomi in quale linguaggio sia stato scritto quell'assembly, &lt;em&gt;Microsoft.VisualBasic.dll&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;E oggi scopro che C++/CLI (&lt;a href="http://www.ecma-international.org/publications/standards/Ecma-372.htm"&gt;ECMA-372&lt;/a&gt;, &lt;em&gt;19.6.2&lt;/em&gt;) mette a disposizione tre accessor anziche' due: &lt;strong&gt;add&lt;/strong&gt;, &lt;strong&gt;remove&lt;/strong&gt; e &lt;strong&gt;&lt;font color="#ff0000"&gt;raise&lt;/font&gt;&lt;/strong&gt;. Quindi, lo snippet del mio vecchio post, diventa in C++/CLI:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;delegate&lt;/strong&gt; &lt;strong&gt;void&lt;/strong&gt; FooFiredEvent();&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;ref&lt;/strong&gt; &lt;strong&gt;class&lt;/strong&gt; Foo {&lt;br /&gt;
    FooFiredEvent^ m_FooFired;&lt;br /&gt;
&lt;br /&gt;
    &lt;strong&gt;public&lt;/strong&gt;: &lt;strong&gt;event&lt;/strong&gt; FooFiredEvent^ FooFired {&lt;br /&gt;
        &lt;strong&gt;void&lt;/strong&gt; add(FooFiredEvent^ value) {&lt;br /&gt;
            m_FooFired += value;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;strong&gt;void&lt;/strong&gt; remove(FooFiredEvent^ value) {&lt;br /&gt;
            m_FooFired -= value;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;font color="#ff0000"&gt;&lt;strong&gt;void&lt;/strong&gt; raise() {&lt;br /&gt;
            &lt;strong&gt;if&lt;/strong&gt;(m_FooFired) {&lt;br /&gt;
                m_FooFired();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;/font&gt;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/88834.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2007/10/08/88834.aspx</guid>
            <pubDate>Tue, 09 Oct 2007 09:37:28 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/88834.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2007/10/08/88834.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/88834.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/88834.aspx</trackback:ping>
        </item>
        <item>
            <title>Quiz Sharp #66 [junior]</title>
            <category>Quiz Sharp</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2007/09/24/88514.aspx</link>
            <description>&lt;p&gt;Questi due snippet compilano senza errori o warning e sembrano equivalenti, ma non lo sono:&lt;/p&gt;
&lt;p&gt;
&lt;/p&gt;&lt;table&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;strong&gt;using&lt;/strong&gt; System;&lt;br /&gt;
            &lt;br /&gt;
            &lt;strong&gt;delegate&lt;/strong&gt; Foo Foo();&lt;br /&gt;
            &lt;br /&gt;
            &lt;strong&gt;class&lt;/strong&gt; Test {&lt;br /&gt;
                &lt;strong&gt;static&lt;/strong&gt; Foo Quiz() {&lt;br /&gt;
                    Console.WriteLine("*");&lt;br /&gt;
                    &lt;strong&gt;return&lt;/strong&gt; Test.Quiz;&lt;br /&gt;
                }&lt;br /&gt;
            &lt;br /&gt;
                &lt;strong&gt;static&lt;/strong&gt; &lt;strong&gt;void&lt;/strong&gt; Main() {&lt;br /&gt;
                    Quiz()()();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;/td&gt;
            &lt;td&gt;&lt;strong&gt;imports&lt;/strong&gt; System&lt;br /&gt;
            &lt;br /&gt;
            &lt;strong&gt;delegate&lt;/strong&gt; &lt;strong&gt;function&lt;/strong&gt; Foo &lt;strong&gt;as&lt;/strong&gt; Foo&lt;br /&gt;
            &lt;br /&gt;
            &lt;strong&gt;class&lt;/strong&gt; Test&lt;br /&gt;
                &lt;strong&gt;shared&lt;/strong&gt; &lt;strong&gt;function&lt;/strong&gt; Quiz &lt;strong&gt;as&lt;/strong&gt; Foo&lt;br /&gt;
                    Console.WriteLine("*")&lt;br /&gt;
                    &lt;strong&gt;return&lt;/strong&gt; Test.Quiz&lt;br /&gt;
                &lt;strong&gt;end&lt;/strong&gt; &lt;strong&gt;function&lt;/strong&gt;&lt;br /&gt;
            &lt;br /&gt;
                &lt;strong&gt;shared&lt;/strong&gt; &lt;strong&gt;sub&lt;/strong&gt; Main&lt;br /&gt;
                    Quiz()()()&lt;br /&gt;
                &lt;strong&gt;end&lt;/strong&gt; &lt;strong&gt;sub&lt;/strong&gt;&lt;br /&gt;
            &lt;strong&gt;end&lt;/strong&gt; &lt;strong&gt;class&lt;/strong&gt;&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;Cosa manca allo snippet VB.NET per essere equivalente a quello C#?&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/88514.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2007/09/24/88514.aspx</guid>
            <pubDate>Mon, 24 Sep 2007 17:44:04 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/88514.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2007/09/24/88514.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/88514.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/88514.aspx</trackback:ping>
        </item>
        <item>
            <title>Quiz Sharp #65 [junior]</title>
            <category>Quiz Sharp</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2007/08/28/88008.aspx</link>
            <description>Una classe &lt;em&gt;Foo&lt;/em&gt; ha un unico costruttore, pubblico e con un parametro. Puo' una classe &lt;em&gt;Bar&lt;/em&gt;, che deriva da &lt;em&gt;Foo&lt;/em&gt;, avere un costruttore senza parametri?&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/88008.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2007/08/28/88008.aspx</guid>
            <pubDate>Wed, 29 Aug 2007 10:54:29 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/88008.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2007/08/28/88008.aspx#feedback</comments>
            <slash:comments>8</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/88008.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/88008.aspx</trackback:ping>
        </item>
        <item>
            <title>Un modo di marcare il valore di default di un enum</title>
            <category>Carillon .NET</category>
            <category>Pattern Dappertutto</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2007/07/28/86906.aspx</link>
            <description>&lt;P&gt;"&lt;I&gt;Do provide a value of zero on simple enums&lt;/I&gt;" dice una linea guida del &lt;A href="http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756/"&gt;FDG&lt;/A&gt; (p. 95). Ma forse sarebbe ancora piu' espressivo &lt;I&gt;marcare&lt;/I&gt; questo valore di default di un enum appunto come una &lt;I&gt;default value expression&lt;/I&gt; (&lt;A href="http://www.ecma-international.org/publications/standards/Ecma-334.htm"&gt;ECMA-334&lt;/A&gt;, 14.5.14) anziche' impostarlo a 0. Cioe', scrivere:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;public enum&lt;/STRONG&gt; Compression&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;None = (&lt;STRONG&gt;int&lt;/STRONG&gt;)&lt;STRONG&gt;default&lt;/STRONG&gt;(Compression),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GZip,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Deflate&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;al posto di None = 0. In ogni caso, il compilatore genera lo stesso IL. E' solo un'idea, che ne dite?&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/86906.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2007/07/28/86906.aspx</guid>
            <pubDate>Sun, 29 Jul 2007 07:12:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/86906.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2007/07/28/86906.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/86906.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/86906.aspx</trackback:ping>
        </item>
        <item>
            <title>Quiz Sharp #64 [junior]</title>
            <category>Quiz Sharp</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2007/07/09/85053.aspx</link>
            <description>&lt;P&gt;Che differenza c'e' tra (&lt;EM&gt;new HybridDictionary(5).Values&lt;/EM&gt;) e (&lt;EM&gt;new HybridDictionary(6).Values&lt;/EM&gt;)?&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/85053.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2007/07/09/85053.aspx</guid>
            <pubDate>Tue, 10 Jul 2007 05:35:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/85053.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2007/07/09/85053.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/85053.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/85053.aspx</trackback:ping>
        </item>
        <item>
            <title>GetCallingLanguage [la soluzione di un quiz di Claudio Brotto]</title>
            <category>Carillon .NET</category>
            <category>Quiz Sharp</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2007/07/08/84939.aspx</link>
            <description>&lt;P&gt;Un po' di mesi fa, Claudio Brotto, aveva proposto &lt;A href="http://blogs.devleap.com/devlizard/archive/2006/11/01/vb-net-e-c-che-differenza-passa-fra.aspx"&gt;un simpatico quiz&lt;/A&gt; a cui vorrei dare adesso una soluzione (in realta' la soluzione e' per una variante leggermente modificata del quiz). Si tratta praticamente di scrivere un metodo pubblico in un assembly in tal modo che, chiamandolo da un altro assembly, questo metodo produca una stringa diversa in base al linguaggio in cui e' stato scritto l'assembly chiamante. Per esempio, questo metodo dovrebbe ritornare la stringa "&lt;STRONG&gt;C#&lt;/STRONG&gt;" se chiamato da un assembly scritto in C#, oppure "&lt;STRONG&gt;Basic&lt;/STRONG&gt;" se chiamato da un assembly scritto in VB.NET, etc. Piccolo vincolo della mia soluzione: l'assembly chiamante &lt;EM&gt;deve&lt;/EM&gt; essere compilato in debug mode.&lt;/P&gt;
&lt;P&gt;Tutto si basa su un metadato che il compilatore inserisce nell'assembly quando compiliamo in debug mode e che serve ai vari debugger. Cercate nel file "foo.il" ottenuto da un &amp;#8220;foo.cs&amp;#8220; qualunque:&lt;/P&gt;
&lt;P&gt;&lt;B&gt;csc /debug+ foo.cs&lt;BR&gt;ildasm foo.exe /linenum /out:foo.il/&lt;/B&gt;&lt;/P&gt;
&lt;P&gt;la direttiva "&lt;B&gt;.language&lt;/B&gt;" (vedi &lt;B&gt;C.3&lt;/B&gt;, &lt;I&gt;Partition VI&lt;/I&gt;, &lt;A href="http://www.ecma-international.org/publications/standards/Ecma-335.htm"&gt;ECMA-335&lt;/A&gt;) e troverete 3 GUID che identificano rispettivamente il linguaggio, il vendor (cioe' il compilatore) e il documento. Solo il primo, cioe' il GUID del linguaggio, e' obbligatorio nella direttiva "&lt;B&gt;.language&lt;/B&gt;". Per vedere l'elenco dei linguaggi mappati da questi GUID, andate nel file "C:\Program Files\Microsoft.NET\SDK\v2.0\include\corsym.h".&lt;/P&gt;
&lt;P&gt;Come possiamo pero' ottenere dal codice, questa informazione? Dopo un po' di giri col &lt;EM&gt;Reflector&lt;/EM&gt;, ho trovato la classe giusta, &lt;B&gt;System.Diagnostics.SymbolStore.SymDocument&lt;/B&gt;, nell'assembly "&lt;STRONG&gt;ISymWrapper.dll&lt;/STRONG&gt;" (nella cartella del framework). In questa classe notiamo la proprieta' &lt;B&gt;Language&lt;/B&gt; di tipo Guid che ci dara' il GUID del linguaggio, incontrato sopra nel file ".il". Il costruttore di questa classe, nonostante pubblico, non ci aiuta tanto, visto il pointer bruttino che non possiamo passarglielo come argomento... Ma sempre coll'aiuto del &lt;EM&gt;Reflector&lt;/EM&gt;, scopriamo chi utilizza questa interessante classe: il metodo &lt;B&gt;GetDocuments&lt;/B&gt; della classe &lt;B&gt;System.Diagnostics.SymbolStore.SymReader&lt;/B&gt;. E qui la stessa storia&amp;nbsp;per il&amp;nbsp;suo costruttore pubblico, ma indagando che altra classe utilizza la &lt;B&gt;SymReader&lt;/B&gt;, arriviamo alla &lt;B&gt;System.Diagnostics.SymbolStore.SymBinder&lt;/B&gt;, che finalmente ha un costruttore pubblico senza parametri!&lt;/P&gt;
&lt;P&gt;Bene, in questa classe &lt;B&gt;SymBinder&lt;/B&gt;, andiamo a vedere un po' il metodo &lt;B&gt;GetReader&lt;/B&gt; con il quale potremo ottenere un'istanza di &lt;B&gt;SymReader&lt;/B&gt;, e da qui ottenere un'istanza di &lt;B&gt;SymDocument&lt;/B&gt;, per arrivare poi al GUID del linguaggio.&lt;/P&gt;
&lt;P&gt;In questo metodo &lt;STRONG&gt;GetReader&lt;/STRONG&gt;, incontriamo un parametro chiamato "&lt;I&gt;importer&lt;/I&gt;", di tipo IntPtr, che punta (dice la documentazione) sulla "&lt;I&gt;metadata import interface&lt;/I&gt;". Questa interfaccia, &lt;B&gt;IMetadataImport&lt;/B&gt;, si trova, insieme alle altre interfacce &lt;I&gt;unmanaged&lt;/I&gt; per i metadati, documentata nel MSDN a &lt;A href="https://msdn2.microsoft.com/en-us/library/ms233411.aspx"&gt;questa pagina&lt;/A&gt; probabilmente poco visitata. Il giro non e' finito perche', per ottenere un'istanza &lt;I&gt;importer&lt;/I&gt; di &lt;B&gt;IMetadataImport&lt;/B&gt;, abbiamo bisogno di un "&lt;I&gt;dispenser&lt;/I&gt;" a cui chiedere di aprire il file dell'assembly (tramite il metodo &lt;B&gt;OpenState&lt;/B&gt;) e trovare l'istanza dell'&lt;I&gt;importer&lt;/I&gt; in un parametro &lt;B&gt;out&lt;/B&gt;. L'istanza del "&lt;I&gt;dispenser&lt;/I&gt;" la otteniamo conoscendo il &lt;B&gt;CLSID_CorMetaDataDispenser&lt;/B&gt; (vedi il file "cor.h" - l'header generale del runtime se avete downloadato il &lt;A href="http://research.microsoft.com/sscli/"&gt;SSCLI (Rotor)&lt;/A&gt;).&lt;/P&gt;
&lt;P&gt;Dobbiamo definirci queste due interfacce &lt;I&gt;unmanaged&lt;/I&gt;, decorandole con i loro GUID presi sempre dal file "cor.h", ma senza dover definire necessariamente i metodi che non ci interessano - per questo motivo ho messo dei metodi &lt;B&gt;Dummy&lt;/B&gt;, semplicemente per occupare lo slot di un metodo che non ci interessa e per poter cosi' arrivare correttamente al metodo &lt;B&gt;OpenState&lt;/B&gt; che e' il secondo metodo dell'interfaccia.&lt;/P&gt;
&lt;P&gt;Quello che ho detto sopra, viene implementato cosi' (sicuramente non e' perfetto come codice ma serve solo per illustrare il concetto):&lt;/P&gt;
&lt;P&gt;// foo.cs&lt;BR&gt;// csc /t:library /r:ISymWrapper.dll foo.cs&lt;BR&gt;using System;&lt;BR&gt;using System.Reflection;&lt;BR&gt;using System.Collections.Generic;&lt;BR&gt;using System.Runtime.InteropServices;&lt;BR&gt;using System.Diagnostics.SymbolStore;&lt;BR&gt;using System.Diagnostics;&lt;BR&gt;&lt;BR&gt;[&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Guid("7DAC8207-D3AE-4c75-9B67-92801A497D44"),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InterfaceType(ComInterfaceType.InterfaceIsIUnknown),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ComVisible(true)&lt;BR&gt;]&lt;BR&gt;public interface IMetadataImport&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void Dummy();&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;[&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Guid("809c652e-7396-11d2-9771-00a0c9b4d50c"),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InterfaceType(ComInterfaceType.InterfaceIsIUnknown),&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ComVisible(true)&lt;BR&gt;]&lt;BR&gt;interface IMetaDataDispenser&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void Dummy(); // DefineScope&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// https://msdn2.microsoft.com/en-us/library/ms231248.aspx&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void OpenScope&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[In, MarshalAs(UnmanagedType.LPWStr)] string szScope,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[In] int dwOpenFlags,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[In] ref Guid riid,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Out, MarshalAs(UnmanagedType.IUnknown)] out object ppIUnk&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;public class Metadata&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public static string GetCallingLanguage()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Assembly assembly = Assembly.GetCallingAssembly();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach (DebuggableAttribute attribute in assembly.GetCustomAttributes(typeof(DebuggableAttribute), false))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!attribute.IsJITTrackingEnabled)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&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;throw new NotSupportedException("Calling assembly not built in Debug mode");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;string location = assembly.Location;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Guid CLSID_CorMetaDataDispenser = new Guid("e5cb7a31-7512-11d2-89ce-0080c792e5d8");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Guid IID_IMetadataImport = new Guid("7DAC8207-D3AE-4c75-9B67-92801A497D44");&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;object importerObj;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IMetaDataDispenser dispenser = (IMetaDataDispenser)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_CorMetaDataDispenser));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dispenser.OpenScope(location, 0, ref IID_IMetadataImport, out importerObj);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IntPtr importer = Marshal.GetComInterfaceForObject(importerObj, typeof(IMetadataImport));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ISymbolReader reader = new SymBinder().GetReader(importer, location, string.Empty);&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// see LanguageType module in&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// C:\Program Files\Microsoft.NET\SDK\v2.0\include\corsym.h&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dictionary&lt;GUID, string&gt; languages = new Dictionary&lt;GUID, string&gt;();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;languages.Add(new Guid("3f5162f8-07c6-11d3-9053-00c04fa302a1"), "C#");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;languages.Add(new Guid("3a12d0b8-c26c-11d0-b442-00a0244a1dd2"), "Basic");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// ...&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return languages[reader.GetDocuments()[0].Language];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;} &lt;/P&gt;
&lt;P&gt;Adesso, questo codice:&lt;/P&gt;
&lt;P&gt;// bar.cs&lt;BR&gt;// csc /r:foo.dll /debug+ bar.cs&lt;BR&gt;class Test&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static void Main()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Console.WriteLine(Metadata.GetCallingLanguage());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;} &lt;/P&gt;
&lt;P&gt;stampera' &lt;B&gt;C#&lt;/B&gt; a console, mentre questo:&lt;/P&gt;
&lt;P&gt;' bar.vb&lt;BR&gt;' vbc /r:foo.dll /debug+ bar.vb&lt;BR&gt;Class Test&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Shared Sub Main&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.Console.WriteLine(Metadata.GetCallingLanguage())&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End Sub&lt;BR&gt;End Class &lt;/P&gt;
&lt;P&gt;che e' &lt;I&gt;identico&lt;/I&gt; con quello C# ma scritto in VB.NET, stampera' &lt;B&gt;Basic&lt;/B&gt; :-)&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/84939.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2007/07/08/84939.aspx</guid>
            <pubDate>Mon, 09 Jul 2007 06:04:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/84939.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2007/07/08/84939.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/84939.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/84939.aspx</trackback:ping>
        </item>
        <item>
            <title>Quiz Sharp #63</title>
            <category>Quiz Sharp</category>
            <link>http://blogs.ugidotnet.org/adrian/archive/2007/06/11/81044.aspx</link>
            <description>&lt;P&gt;Questo snippet:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;class&lt;/STRONG&gt; Test&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;STRONG&gt;static void&lt;/STRONG&gt; Main()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;STRONG&gt;try&lt;/STRONG&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// qui manca del codice&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;STRONG&gt;catch&lt;/STRONG&gt;{}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;}&lt;/P&gt;
&lt;P&gt;a cui manca un pezzo di codice solo nel posto indicato dal commento, si esegue con un errore a runtime nonstante il &lt;EM&gt;catch&lt;/EM&gt; generale. Che codice manca?&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/81044.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2007/06/11/81044.aspx</guid>
            <pubDate>Mon, 11 Jun 2007 22:42:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/81044.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2007/06/11/81044.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/81044.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/81044.aspx</trackback:ping>
        </item>
    </channel>
</rss>