<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>Pattern Dappertutto</title>
        <link>http://blogs.ugidotnet.org/adrian/category/309.aspx</link>
        <description>Pattern Dappertutto</description>
        <language>it-IT</language>
        <copyright>Adrian Florea</copyright>
        <managingEditor>adrian_florea@yahoo.com</managingEditor>
        <generator>Subtext Version 1.9.5.176</generator>
        <item>
            <title>Lazy loading in una riga</title>
            <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>3</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>Best practice Path.Combine</title>
            <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>
            <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>Il pattern Decorator e la decorazione con un extension method generico</title>
            <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>Collecting Parameter e Fluent Interface - due pattern simmetrici</title>
            <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>Un modo di marcare il valore di default di un enum</title>
            <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>EqualsDefault e l'Equals statico della System.Object</title>
            <link>http://blogs.ugidotnet.org/adrian/archive/2006/10/29/53236.aspx</link>
            <description>&lt;P&gt;A volte, un umile metodo come l'&lt;B&gt;Equals&lt;/B&gt; statico della classe &lt;B&gt;System.Object&lt;/B&gt; pu&amp;#242; rendersi sorprendentemente utile. Per esempio, in una classe generica in cui il type parameter T pu&amp;#242; essere sia una &lt;B&gt;class&lt;/B&gt; che una &lt;B&gt;struct&lt;/B&gt;, abbiamo la necessit&amp;#224; di controllare che un'istanza di T sia &lt;B&gt;default&lt;/B&gt;(T).&lt;/P&gt;
&lt;P&gt;&lt;B&gt;class&lt;/B&gt; Foo&amp;lt;T&amp;gt; { &lt;B&gt;public bool&lt;/B&gt; EqualsDefault(T t) { /* ? */ } } &lt;/P&gt;
&lt;P&gt;Senza l'&lt;B&gt;Equals&lt;/B&gt; statico le soluzioni sono abbastanza bruttine:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;non possiamo avere t == &lt;B&gt;null&lt;/B&gt; perch&amp;#233; T pu&amp;#242; essere una &lt;B&gt;struct&lt;/B&gt;; &lt;/LI&gt;
&lt;LI&gt;non possiamo avere t == &lt;B&gt;default&lt;/B&gt;(T) per l'errore &lt;B&gt;CS0019&lt;/B&gt; ("&lt;I&gt;Operator '&lt;/I&gt;==&lt;I&gt;' cannot be applied to operands of type '&lt;/I&gt;T&lt;I&gt;' and '&lt;/I&gt;T&lt;I&gt;'&lt;/I&gt;"); &lt;/LI&gt;
&lt;LI&gt;non possiamo avere t.&lt;B&gt;Equals&lt;/B&gt;(&lt;B&gt;default&lt;/B&gt;(T)) perch&amp;#233; se t &amp;#232; &lt;B&gt;null&lt;/B&gt;, abbiamo &lt;B&gt;NullReferenceException&lt;/B&gt;.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Utilizzando&amp;nbsp;l'&lt;STRONG&gt;Equals&lt;/STRONG&gt; statico invece, la soluzione&amp;nbsp;diventa&amp;nbsp;banale:&lt;/P&gt;
&lt;P&gt;&lt;B&gt;return object.Equals&lt;/B&gt;(t, &lt;B&gt;default&lt;/B&gt;(T));&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/53236.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2006/10/29/53236.aspx</guid>
            <pubDate>Mon, 30 Oct 2006 00:24:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/53236.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2006/10/29/53236.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/53236.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/53236.aspx</trackback:ping>
        </item>
        <item>
            <title>[GUISA] Generic Special Case?</title>
            <link>http://blogs.ugidotnet.org/adrian/archive/2006/10/27/53186.aspx</link>
            <description>&lt;A href="http://guisa.it/forums/thread/148.aspx"&gt;Un altro thread&lt;/A&gt; sul forum di GUISA, partendo da una &lt;A href="http://blogs.ugidotnet.org/janky/archive/2006/10/09/50571.aspx"&gt;frase di Janky&lt;/A&gt;. Solo un invito a trovare una soluzione insieme...&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/53186.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2006/10/27/53186.aspx</guid>
            <pubDate>Sat, 28 Oct 2006 07:10:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/53186.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2006/10/27/53186.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/53186.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/53186.aspx</trackback:ping>
        </item>
        <item>
            <title>[GUISA] Enumerable State Machine</title>
            <link>http://blogs.ugidotnet.org/adrian/archive/2006/10/26/52943.aspx</link>
            <description>Sul forum di &lt;A href="http://guisa.it/"&gt;GUISA&lt;/A&gt; ho postato &lt;A href="http://guisa.it/forums/thread/136.aspx"&gt;qui&lt;/A&gt; un'implementazione del pattern State sfruttando la macchina a stati generata dal compilatore C# 2.0 per un iteratore generico. L'idea mi &amp;#232; venuta per gioco, diciamo che per adesso potrebbe essere interessante soprattutto per quelli che vogliono capire gli iteratori generici, non necessariamente come implementazione "seria" del pattern State.&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/52943.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2006/10/26/52943.aspx</guid>
            <pubDate>Fri, 27 Oct 2006 00:56:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/52943.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2006/10/26/52943.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/52943.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/52943.aspx</trackback:ping>
        </item>
        <item>
            <title>[GUISA] Quando non rispettare le linee guida?</title>
            <link>http://blogs.ugidotnet.org/adrian/archive/2006/10/25/52540.aspx</link>
            <description>&lt;P&gt;Ho appena creato un &lt;A href="http://guisa.it/forums/thread/131.aspx"&gt;thread&lt;/A&gt; sul forum di &lt;A href="http://guisa.it/"&gt;GUISA&lt;/A&gt; (Gruppo Utenti Italiani Solution Architect) in cui offro un esempio dove ha senso che il metodo &lt;B&gt;GetHashCode&lt;/B&gt; ritorni sempre un valore costante e dove il metodo &lt;B&gt;Equals&lt;/B&gt; &amp;#232; molto atipico: due istanze sono uguali se sono istanze del tipo contenente questi metodi - quindi semantica statica per una classe non-statica.&lt;/P&gt;
&lt;P&gt;Cercher&amp;#242; di postare l&amp;#236; le cose che riguardano l'architettura, per seguire sia io che voi pi&amp;#249; facilmente i feedback, mentre qui sul blog solo una piccola info.&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/adrian/aggbug/52540.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Adrian Florea</dc:creator>
            <guid>http://blogs.ugidotnet.org/adrian/archive/2006/10/25/52540.aspx</guid>
            <pubDate>Thu, 26 Oct 2006 03:29:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/adrian/comments/52540.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/adrian/archive/2006/10/25/52540.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/adrian/comments/commentRss/52540.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/adrian/services/trackbacks/52540.aspx</trackback:ping>
        </item>
    </channel>
</rss>