<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>.NET Framework 3.5</title>
        <link>http://www.coding4art.com/category/3.aspx</link>
        <description>.NET Framework 3.5</description>
        <language>en-US</language>
        <copyright>Maurizio</copyright>
        <generator>Subtext Version 2.1.2.2</generator>
        <item>
            <title>Object Identity / Equality</title>
            <link>http://www.coding4art.com/archive/2010/05/03/object-identity-equality.aspx</link>
            <description>&lt;p&gt;E’ noto che il metodo virtuale &lt;strong&gt;Equals&lt;/strong&gt; ereditato da ogni oggetto dalla classe &lt;strong&gt;System.Object&lt;/strong&gt; permette di definire un criterio di uguaglianza tra due oggetti non basato esclusivamente sulla reference (ovvero 2 oggetti sono uguali se puntano alla stessa istanza di un determinato oggetto).&lt;/p&gt;  &lt;p&gt;E’ altresì noto che ridefinendo il metodo &lt;strong&gt;Equals&lt;/strong&gt; siamo costretti a ridefinire il metodo &lt;strong&gt;GetHashCode&lt;/strong&gt; per far si che in presenza di 2 oggetti uguali (&lt;strong&gt;Equals&lt;/strong&gt; che ritorna true), il metodo &lt;strong&gt;GetHashCode&lt;/strong&gt; ritorni lo stesso valore di hash per i 2 oggetti, questo perchè l’oggetto in questione potrebbe essere usato come chiave in una collezione di tipo &lt;strong&gt;HashTable&lt;/strong&gt; o &lt;strong&gt;Dictionary&amp;lt;T,V&amp;gt;.&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;L’implementazione di &lt;strong&gt;GetHashCode&lt;/strong&gt; fornita dalla classe &lt;strong&gt;System.Object&lt;/strong&gt; fornisce un valore di hash distinto per ogni istanza di una data classe presente in un dato &lt;strong&gt;AppDomain&lt;/strong&gt;, e tutto ciò è in linea con l’implementazione di &lt;strong&gt;Equals&lt;/strong&gt; fornita da &lt;strong&gt;System.Object&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Ma se per un dato oggetto volessimo forzare l’uguaglianza per riferimento ?&lt;/p&gt;  &lt;p&gt;Non basta usare &lt;strong&gt;ReferenceEquals(x, y)&lt;/strong&gt; perchè, come detto, alcune classi come i dizionari utilizzano il metodo &lt;strong&gt;Equals&lt;/strong&gt; per definire l’uguaglianza tra due oggetti (che di default si traduce in “identità” di un oggetto e non in “uguaglianza”).&lt;/p&gt;  &lt;p&gt;Dovremmo ridefinire il medoto Equals in questo modo:&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; height: 78px; max-height: 200px; font-size: 8pt; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; Equals(&lt;span style="color: #0000ff"&gt;object&lt;/span&gt; obj) &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; { &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; System.Object.ReferenceEquals(&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;, obj); &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; } &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;ma in questo modo saremmo costratti ancha a ridefinire &lt;strong&gt;GetHashCode&lt;/strong&gt; senza poter fornire l’implementazione standard di &lt;strong&gt;System.Object&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Questo problema si risolve utilizzando il medoto &lt;strong&gt;GetHashCode&lt;/strong&gt;, ma quello fornito dalla classe &lt;strong&gt;System.Runtime.CompilersServices.RuntimeHelpers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Questo metodo infatti, a dispetto del nome identito al metodo della classe &lt;strong&gt;System.Object&lt;/strong&gt;, ritorna sempre un valore hash univoco per ogni istanza distinta di ogni oggetto in memoria, ovvero esattamente l’implementazione standard fornita da &lt;strong&gt;System.Object&lt;/strong&gt; a prescindere se il metodo virtuale &lt;strong&gt;Object.GetHashCode&lt;/strong&gt; sia o non sia ridefinito, ed adatta alla sola uguaglianza per riferimento.&lt;/p&gt;

&lt;p&gt;Il tutto può essere inglobato in una classe &lt;strong&gt;Comparer&lt;/strong&gt; apposita, in questo modo:&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; height: 300px; max-height: 445px; font-size: 8pt; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Runtime.CompilerServices;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;  &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; ReferenceComparer&amp;lt;T&amp;gt; : IEqualityComparer&amp;lt;T&amp;gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; { &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;     &lt;span style="color: #cc6633"&gt;#region&lt;/span&gt; IEqualityComparer&amp;lt;T&amp;gt; Members &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;  &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;bool&lt;/span&gt; Equals(T x, T y) &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;     { &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; System.Object.ReferenceEquals(x, y); &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;     } &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;  &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; GetHashCode(T obj) &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;     { &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; RuntimeHelpers.GetHashCode(obj);&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;     } &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;  &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;     &lt;span style="color: #cc6633"&gt;#endregion&lt;/span&gt; &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt; } &lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;&lt;img src="http://www.coding4art.com/aggbug/155.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Maurizio</dc:creator>
            <guid>http://www.coding4art.com/archive/2010/05/03/object-identity-equality.aspx</guid>
            <pubDate>Mon, 03 May 2010 21:03:00 GMT</pubDate>
            <wfw:comment>http://www.coding4art.com/comments/155.aspx</wfw:comment>
            <comments>http://www.coding4art.com/archive/2010/05/03/object-identity-equality.aspx#feedback</comments>
            <wfw:commentRss>http://www.coding4art.com/comments/commentRss/155.aspx</wfw:commentRss>
            <trackback:ping>http://www.coding4art.com/services/trackbacks/155.aspx</trackback:ping>
        </item>
        <item>
            <title>Raccolta extension methods</title>
            <link>http://www.coding4art.com/archive/2010/04/13/raccolta-extension-methods.aspx</link>
            <description>&lt;p&gt;Gli extension methods sono una feature estremamente potente ed interessante, introdotta a partire dal .Net Framework 3.5 SP1.&lt;/p&gt;
&lt;p&gt;A tal proposito, su &lt;a target="_blank" href="http://www.codeplex.com/"&gt;Codeplex&lt;/a&gt; è presente un interessantissima &lt;a target="_blank" href="http://dnpextensions.codeplex.com/"&gt;libreria di codice&lt;/a&gt; che raccoglie extension methods applicati a svariati tipi.&lt;/p&gt;
&lt;p&gt;Davvero molto molto utile. &lt;/p&gt;
&lt;p&gt;Come detto &lt;a target="_blank" href="http://www.ugidotnet.org/Article/Detail/1316"&gt;qui&lt;/a&gt; da &lt;a target="_blank" href="http://www.ugidotnet.org/Member/Detail/0ab3978d-0982-4eaa-80d5-0dbf344e5975"&gt;Gianluca Carucci&lt;/a&gt;, questa feature non necessita necessariamente della versione 3.5 del .Net Framework per essere utilizzata, ma, con un piccolo accorgimento, è possibile sfruttarne a pieno le potenzialità utilizzando anche il .Net Framework 2.0.&lt;/p&gt;
&lt;p&gt;Pertanto, nella pagina Codeplex sopra citata, i “requirements” sono errati. &lt;img alt="smile_regular" src="http://spaces.live.com/rte/emoticons/smile_regular.gif" /&gt;&lt;/p&gt;&lt;img src="http://www.coding4art.com/aggbug/150.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Maurizio</dc:creator>
            <guid>http://www.coding4art.com/archive/2010/04/13/raccolta-extension-methods.aspx</guid>
            <pubDate>Tue, 13 Apr 2010 12:46:00 GMT</pubDate>
            <wfw:comment>http://www.coding4art.com/comments/150.aspx</wfw:comment>
            <comments>http://www.coding4art.com/archive/2010/04/13/raccolta-extension-methods.aspx#feedback</comments>
            <wfw:commentRss>http://www.coding4art.com/comments/commentRss/150.aspx</wfw:commentRss>
            <trackback:ping>http://www.coding4art.com/services/trackbacks/150.aspx</trackback:ping>
        </item>
        <item>
            <title>Link utili della settimana #1</title>
            <link>http://www.coding4art.com/archive/2009/10/08/link-utili-della-settimana-2.aspx</link>
            <description>&lt;p&gt;- &lt;a href="http://www.galasoft.ch/mvvm/getstarted/" target="_blank" mce_href="http://www.galasoft.ch/mvvm/getstarted/"&gt;MVVM Toolkit Light&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;- &lt;a href="http://ajaxcontroltoolkit.codeplex.com/release/projectreleases.aspx?releaseid=33804" target="_blank" mce_href="http://ajaxcontroltoolkit.codeplex.com/release/projectreleases.aspx?releaseid=33804"&gt;Ajax Control Toolkit&lt;/a&gt; release 30930 (30 sett 2009);&lt;/p&gt;
&lt;p&gt;-&lt;a href="http://wscfblue.codeplex.com/" target="_blank" mce_href="http://wscfblue.codeplex.com/"&gt;thinktecture.WSCF.blue&lt;/a&gt; (Contract first WCF Tool)&lt;/p&gt;
&lt;p&gt;- The &lt;a href="http://msdn.microsoft.com/en-us/magazine/dd419663.aspx" target="_blank" mce_href="http://msdn.microsoft.com/en-us/magazine/dd419663.aspx"&gt;ModelView-ViewModel&lt;/a&gt; design pattern for WPF&lt;/p&gt;
&lt;p&gt;- &lt;a href="http://www.coderun.com/" target="_blank" mce_href="http://www.coderun.com/"&gt;Code Run&lt;/a&gt; (questo è davvero incredibile, si evincono chiaramente le potenzialità del Cloud Computing).  Trattasi di un IDE Online, con cui è possibile sviluppare progetti .NET direttamente nel browser, potendo anche disporre di un ambiente di host on the cloud, su cui è possibile effettuare il deployment delle proprie applicazioni sviluppate on line.&lt;/p&gt;
&lt;p&gt;- &lt;a href="http://www.we-coffee.com/bonnie.aspx" target="_blank" mce_href="http://www.we-coffee.com/bonnie.aspx"&gt;Bonnie .NET&lt;/a&gt; API per sviluppare applicazioni che usano la crittografia della informazioni o certificati X.509&lt;/p&gt;&lt;img src="http://www.coding4art.com/aggbug/120.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>maurizio</dc:creator>
            <guid>http://www.coding4art.com/archive/2009/10/08/link-utili-della-settimana-2.aspx</guid>
            <pubDate>Thu, 08 Oct 2009 21:50:00 GMT</pubDate>
            <wfw:comment>http://www.coding4art.com/comments/120.aspx</wfw:comment>
            <comments>http://www.coding4art.com/archive/2009/10/08/link-utili-della-settimana-2.aspx#feedback</comments>
            <wfw:commentRss>http://www.coding4art.com/comments/commentRss/120.aspx</wfw:commentRss>
            <trackback:ping>http://www.coding4art.com/services/trackbacks/120.aspx</trackback:ping>
        </item>
        <item>
            <title>Come ottenere il nome del metodo chiamante dallo stack usando reflection</title>
            <link>http://www.coding4art.com/archive/2009/08/14/come-ottenere-il-nome-del-metodo-chiamante-dallo-stack-usando.aspx</link>
            <description>&lt;p&gt;Cosi:&lt;/p&gt; &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4"&gt; &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; System.Diagnostics;&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Log(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; eventMessage)&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt; { &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;"Event logged by "&lt;/span&gt; + (&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StackTrace()).GetFrame(1).GetMethod().Name); &lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;    Console.WriteLine(&lt;span style="color: #006080"&gt;"Event: "&lt;/span&gt; + eventMessage);&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt; }&lt;/pre&gt;&lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;  &lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Fonte: &lt;a href="http://blogs.msdn.com/webdevelopertips/archive/2009/06/23/tip-83-did-you-know-you-can-get-the-name-of-the-calling-method-from-the-stack-using-reflection.aspx" target="_blank"&gt;Tips &amp;amp; Tricks for ASP.NET, IIS, and Visual Web Developer&lt;/a&gt;&lt;/p&gt;&lt;pre&gt; &lt;/pre&gt;&lt;img src="http://www.coding4art.com/aggbug/113.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>maurizio</dc:creator>
            <guid>http://www.coding4art.com/archive/2009/08/14/come-ottenere-il-nome-del-metodo-chiamante-dallo-stack-usando.aspx</guid>
            <pubDate>Thu, 13 Aug 2009 23:41:14 GMT</pubDate>
            <wfw:comment>http://www.coding4art.com/comments/113.aspx</wfw:comment>
            <comments>http://www.coding4art.com/archive/2009/08/14/come-ottenere-il-nome-del-metodo-chiamante-dallo-stack-usando.aspx#feedback</comments>
            <wfw:commentRss>http://www.coding4art.com/comments/commentRss/113.aspx</wfw:commentRss>
            <trackback:ping>http://www.coding4art.com/services/trackbacks/113.aspx</trackback:ping>
        </item>
        <item>
            <title>Invocazione di store procedure oracle in .NET</title>
            <link>http://www.coding4art.com/archive/2009/02/16/invocazione-di-store-procedure-oracle-in-net.aspx</link>
            <description>&lt;p&gt;Il&lt;strong&gt; Data Access Application Block&lt;/strong&gt;, contenuto all'interno della &lt;strong&gt;Enterprise Library 4.1&lt;/strong&gt; consente di richiamare store procedures passando esclusivamente il valore dei singoli parametri richiesti (mediante l'utilizzo del metodo&lt;strong&gt; GetStorepProcCommand&lt;/strong&gt; dell'oggetto &lt;strong&gt;DatabaseFactory&lt;/strong&gt;), nello stesso ordine con cui questi sono espressi nella firma della procedura. Poichè ADO .NET richiede comunque che ogni informazione in merito ai parametri della store sia obbligatoria (quindi tipo di dato, dimensione, precisione, scala, ecc), il metodo effettua internamente una chiamata al metodo &lt;strong&gt;DeriveParameters&lt;/strong&gt; di ADO .NET che, attraverso un round-trip al database server, consente di recuperare tutte le informazioni necessarie sui parametri. Poichè come detto, questa chiamata richiede un round-trip verso il server, il data access application block fornisce anche un meccanismo di caching delle informazioni sui parametri recuperate dal server. &lt;/p&gt; &lt;p&gt;Oracle e SqServer hanno un meccanismo differente circa il ritorno di un resultset da una store procedure. Oracle infatti richiede, a differenza di Sql Server, l'utilizzo di un cursore come parametro di output per recuperare il resultset derivante da procedure che lo ritornano, fornendo anche un tipo speciale di dato, cursor appunto, nel suo provider nativo per .NET.&lt;/p&gt; &lt;p&gt;Se si usa il Data Access Application Block per invocare store procedure Oracle che ritornano un resultset attraverso l'uso di un cursore come parametro di output, non è necessario indicare quest'ultimo tra i parametri (anche perchè, pur provando ad indicarlo esplicitamente, non si troverebbe il tipo di dati &lt;strong&gt;cursor&lt;/strong&gt; disponibile tra i tipi di dati in quanto viene usato l'enum&lt;strong&gt; System.Data.DbType&lt;/strong&gt; che rappresenta genericamente i tpi di dati  per qualsiasi .NET Data Provider).&lt;/p&gt; &lt;p&gt;Basta infatti passare un generico parametro di output avente il valore null come primo parametro della store procedure Oracle e l'oggetto &lt;strong&gt;OracleDatabase&lt;/strong&gt; farà il lavoro per noi. Questo oggetto infatti assume che il primo parametro di una store procedure sia un cursore di output per la restituzione del resultset&lt;/p&gt;&lt;img src="http://www.coding4art.com/aggbug/103.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>maurizio</dc:creator>
            <guid>http://www.coding4art.com/archive/2009/02/16/invocazione-di-store-procedure-oracle-in-net.aspx</guid>
            <pubDate>Mon, 16 Feb 2009 01:50:39 GMT</pubDate>
            <wfw:comment>http://www.coding4art.com/comments/103.aspx</wfw:comment>
            <comments>http://www.coding4art.com/archive/2009/02/16/invocazione-di-store-procedure-oracle-in-net.aspx#feedback</comments>
            <wfw:commentRss>http://www.coding4art.com/comments/commentRss/103.aspx</wfw:commentRss>
            <trackback:ping>http://www.coding4art.com/services/trackbacks/103.aspx</trackback:ping>
        </item>
        <item>
            <title>Le direttive using devono essere poste all'interno del namespace</title>
            <link>http://www.coding4art.com/archive/2008/07/22/le-direttive-using-devono-essere-poste-all-interno-del-namespace.aspx</link>
            <description>&lt;p&gt;Questo post inizia con una frase tratta da un &lt;a href="http://www.hanselman.com/blog/BackToBasicsDoNamespaceUsingDirectivesAffectAssemblyLoading.aspx" target="_blank"&gt;post&lt;/a&gt; di &lt;a href="http://www.hanselman.com/blog/" target="_blank"&gt;Scott Hanselmann&lt;/a&gt; con cui mi trovo completamente d'accordo:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Don't believe everything you read, even on a Microsoft Blog.              Don't believe this blog, either!                                                           Decide  for yourself with experiments if you need a tiebreaker!&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Credo sia proprio vero, mai fidarsi ciecamente di quello che si legge in giro, soprattutto quando seri dubbi farebbero pensare il contrario.&lt;/p&gt;  &lt;p&gt;Il motivo è presto detto: utilizzo normalmente &lt;strong&gt;FxCop&lt;/strong&gt; come strumento di analisi del codice sorgente, lo trovo molto completo e ben fatto. Spinto dalla curiosità ho voluto utilizzare &lt;strong&gt;Source Analysis&lt;/strong&gt;, un tool gratuito fornito da Microsoft ed integrato nell'IDE di Visual Studio. Dopo la primissima prova fatta mi ha incuriosito una sua segnalazione:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;SA1200 - All using directives must be placed inside of the namaspace.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Per farla breve, tutti i files sorgenti del mio progetto provocavano una segnalazione di questo tipo poichè le direttive using erano poste esternamente alla definizione del namespace, così come automaticamente viene creato uno scheletro di una classe all'interno dell'IDE. La segnalazione in questione invita invece ad includere le direttive using all'interno della definizione del namespace, semprecchè sia presente. Facendo qualche ricerca in giro ho scoperto che in questo modo il compilatore segnala immediatamente una eventuale ambiguità tra i nomi dei tipi creati all'interno del proprio namespace e i tipi presenti nei vari namespace del .NET Framework. E fin qui nulla di strano. &lt;/p&gt;  &lt;p&gt;Ho scoperto inoltre che questa guideline servirebbe anche ad aumentare le prestazioni, almeno nei casi specifici, in quanto forzarebbe il "lazy loading" degli assembly e non il caricamento immediato. In altre parole, quando il viene invocato un metodo di una classe e viene compilato il codice "just in time" (JITTED) il lazy loading permette di caricare in memoria solo gli assembly referenziati che servono all'invocazione del metodo stesso, e non tutti gli assembly referenziati da una classe, a prescindere se utilizzati o no da una specifica invocazione di un metodo. Questo permette di caricare solo lo stretto necessario anche se una classe referenzia un assemby non utilizzato da un metodo.&lt;/p&gt;  &lt;p&gt;Sinceramente non mi è venuto in mente un solo valido motivo per cui una direttiva using posta in un certo modo potesse influenzare l'attività del CRL a runtime, e sono rimasto alquanto dubbioso sulla effettiva validità. Prima che potessi avere il tempo di fare una prova specifica mi son trovato questo &lt;a href="http://www.hanselman.com/blog/BackToBasicsDoNamespaceUsingDirectivesAffectAssemblyLoading.aspx" target="_blank"&gt;post&lt;/a&gt; di &lt;a href="http://www.hanselman.com/blog/" target="_blank"&gt;Scott Hanselmann&lt;/a&gt;, al quale rimando per una esauriente spiegazione, che dimostra come purtroppo ciò non sia affatto vero, cioè gli assembly referenziati vengono caricati tutti i memoria immediatamente, a prescindere se il metodo in questione li usa oppure no, ed a prescindere se le direttive using vengono poste all'interno o all'esterno della definizione di namespace.&lt;/p&gt;  &lt;p&gt;Quindi la morale è: non credere mai a quello che leggi, neanche se lo leggi da questo blog :), ma sperimenta sempre.&lt;/p&gt;&lt;img src="http://www.coding4art.com/aggbug/92.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>maurizio</dc:creator>
            <guid>http://www.coding4art.com/archive/2008/07/22/le-direttive-using-devono-essere-poste-all-interno-del-namespace.aspx</guid>
            <pubDate>Tue, 22 Jul 2008 02:59:42 GMT</pubDate>
            <wfw:comment>http://www.coding4art.com/comments/92.aspx</wfw:comment>
            <comments>http://www.coding4art.com/archive/2008/07/22/le-direttive-using-devono-essere-poste-all-interno-del-namespace.aspx#feedback</comments>
            <wfw:commentRss>http://www.coding4art.com/comments/commentRss/92.aspx</wfw:commentRss>
            <trackback:ping>http://www.coding4art.com/services/trackbacks/92.aspx</trackback:ping>
        </item>
        <item>
            <title>Automatic properties in c# 3.0</title>
            <link>http://www.coding4art.com/archive/2008/07/20/automatic-properties-in-c-3-0.aspx</link>
            <description>&lt;p&gt;Utilizzando C# 3.0 è possibile scrivere le proprietà di una classe in modo estremamente compatto, in questo modo:&lt;/p&gt; &lt;p&gt;&lt;font color="#00ffff"&gt;Public string Nome {get; set;}&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Questa modalità, chiamata "Automatic properties" permette quindi di omettere il riferimento al membro privato che normalmente viene "wrappato" dalla proprietà stessa.&lt;/p&gt; &lt;p&gt;Sarà compito del compilatore autogenerare al volo il membro privato al momento della compilazione. Questa caratteristica impone che il codice della classe non può in nessun modo accedere alla variabile privata, appunto perchè al momento della stesura del codice essa non esiste ancora in quanto sarà autogenerata in fase di compilazione. E' quindi necessario utilizzare direttamente il nome della proprietà nel codice della classe per accedere al suo contenuto e/o modificarlo. &lt;/p&gt; &lt;p&gt;L'impossibilità del codice ad accedere alla variabile privata è dovuta al fatto che, poichè è possibile in qualsiasi momento tornare alla dichiarazione classica della proprietà indicando esplicitamente una variabile privata, è necessario assicurare al codice la piena compatibilità tra le due modalità. In altre parole, se si trasforma una "Automatic property" in una proprietà diciamo così "classica", il codice che la utilizza continuerà a funzionare senza problemi perchè è certo che non avrà in nessun modo potuto utilizzare la variabile privata autogenerata. Per lo stesso motivo, non è possibile indicare un solo "accessor" per la proprietà ma dovranno essere indicati obbligatoriamente entrambi (get; set;), fermo restando che è sempre possibile indicare un ambito di visibilità diverso tra i due "accessor" (es. &lt;strong&gt;get;&lt;/strong&gt; con visibilità public e &lt;strong&gt;set;&lt;/strong&gt; con visibilità private)&lt;/p&gt;&lt;img src="http://www.coding4art.com/aggbug/90.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>maurizio</dc:creator>
            <guid>http://www.coding4art.com/archive/2008/07/20/automatic-properties-in-c-3-0.aspx</guid>
            <pubDate>Sun, 20 Jul 2008 09:27:31 GMT</pubDate>
            <wfw:comment>http://www.coding4art.com/comments/90.aspx</wfw:comment>
            <comments>http://www.coding4art.com/archive/2008/07/20/automatic-properties-in-c-3-0.aspx#feedback</comments>
            <wfw:commentRss>http://www.coding4art.com/comments/commentRss/90.aspx</wfw:commentRss>
            <trackback:ping>http://www.coding4art.com/services/trackbacks/90.aspx</trackback:ping>
        </item>
        <item>
            <title>Extentions Methods, come crearli</title>
            <link>http://www.coding4art.com/archive/2008/05/13/extentions-methods-come-crearli.aspx</link>
            <description>&lt;p&gt;Una delle più interessanti feature disponibili con la versione 3.5 del .NET Framework sono, a mio avviso, gli Extention Methods, caratteristica legata al linguaggio di programmazione che permette di aggiungere metodi personalizzati a qualsiasi classe/interfaccia del .NET Framework, incluse le classi usate come classi di base (un esempio per tutte: la classe object),  "estendendo" appunto il tipo originale. &lt;/p&gt; &lt;p&gt;In tal modo è possibile estendere il contratto pubblico  esposto dalla classe /interfaccia senza per questo ricorrere all'ereditarietà. Utilizzando invece quest'ultima tecnica si era limitati alle solo classi ereditabili (non dichiarate "sealed", come ad esempio la classe System.String), e soprattutto si correva il rischio di compromettere la consistenza dell'oggetto nel caso in cui facendo l'override di un metodo ci si dimenticava di richiamare il corrispondente metodo della classe di base.&lt;/p&gt; &lt;p&gt;A volte molti programmatori ricorrono all'ereditarietà per la semplice esigenza di aggiungere propri metodi ad una classe, non certo per ridefinire il comportamento della classe di base.&lt;/p&gt; &lt;p&gt;Inoltre, l'Intellisense di Visual Studio fornisce pieno supporto per gli Extention Methods, visualizzandoli correttamente all'interno del tipo che estendono, con una icona personalizzata.&lt;/p&gt; &lt;p&gt;Guardando i numerosi esempi di "Extention methods" disponibili sulla rete ho notato però che questi metodi sono inclusi in una classe avente un namespace custom, esempio Mycomponent.Extentions.StringExtentions per gli extention methods della classe String. Questo è a mio avviso un errore, in quanto così facendo l'Intellisense di Visual Studio non mostra gli Extention Methods di una certa classe se il relativo namespace non viene importato (cosa ovvia). Questo comportamento sicuramente disorienta, in quanto dato un certo tipo la lista dei suoi metodi visualizzata è parziale.&lt;/p&gt; &lt;p&gt;Quindi, gli Extention Methods di un tipo dovrebbero essere raggruppati un una classe inserita nello stesso namespace del tipo che estendono. Nell'esempio precedente per estendere la classe System.String la relativa classe statica dovrebbe essere inclusa nel namespace System.&lt;/p&gt; &lt;p&gt;In questo modo, importando un solo namespace sono visibili sia i metodi pubblici che i metodi estesi.&lt;/p&gt; &lt;p&gt;D'altronde, questo è il comportamento dello stesso Framework. Ad esempio tutti gli Extentions Methods della classe System.Data.DataTable sono racchiusi nella classe DataTableExtentions inserita nel namespace System.Data.&lt;/p&gt;&lt;img src="http://www.coding4art.com/aggbug/87.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>maurizio</dc:creator>
            <guid>http://www.coding4art.com/archive/2008/05/13/extentions-methods-come-crearli.aspx</guid>
            <pubDate>Tue, 13 May 2008 05:32:22 GMT</pubDate>
            <wfw:comment>http://www.coding4art.com/comments/87.aspx</wfw:comment>
            <comments>http://www.coding4art.com/archive/2008/05/13/extentions-methods-come-crearli.aspx#feedback</comments>
            <wfw:commentRss>http://www.coding4art.com/comments/commentRss/87.aspx</wfw:commentRss>
            <trackback:ping>http://www.coding4art.com/services/trackbacks/87.aspx</trackback:ping>
        </item>
        <item>
            <title>101 LINQ Samples</title>
            <link>http://www.coding4art.com/archive/2008/04/23/101-linq-samples.aspx</link>
            <description>&lt;p&gt;Se lavorate con LINQ, questa pagina è utile averla sempre a portata di mouse. &lt;/p&gt; &lt;p&gt;&lt;a href="http://msdn2.microsoft.com/en-us/vcsharp/aa336746.aspx"&gt;101 LINQ Samples&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.coding4art.com/aggbug/85.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>maurizio</dc:creator>
            <guid>http://www.coding4art.com/archive/2008/04/23/101-linq-samples.aspx</guid>
            <pubDate>Wed, 23 Apr 2008 04:51:53 GMT</pubDate>
            <wfw:comment>http://www.coding4art.com/comments/85.aspx</wfw:comment>
            <comments>http://www.coding4art.com/archive/2008/04/23/101-linq-samples.aspx#feedback</comments>
            <wfw:commentRss>http://www.coding4art.com/comments/commentRss/85.aspx</wfw:commentRss>
            <trackback:ping>http://www.coding4art.com/services/trackbacks/85.aspx</trackback:ping>
        </item>
    </channel>
</rss>