<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>Software Development</title>
        <link>http://blog.colinmackay.net/category/3.aspx</link>
        <description>Posts of interest to software developers</description>
        <language>en-GB</language>
        <copyright>Colin Angus Mackay</copyright>
        <managingEditor>colin.mackay@gmail.com</managingEditor>
        <generator>Subtext Version 1.9.0.27</generator>
        <item>
            <title>Visual Studio 2008 SP1</title>
            <link>http://blog.colinmackay.net/archive/2008/08/12/3331.aspx</link>
            <description>&lt;p&gt;Visual Studio 2008 SP1 is here and can be downloaded. &lt;a href="http://blogs.msdn.com/charlie/archive/2008/08/11/released-visual-studio-service-pack-1-net-3-5-service-pack-1.aspx"&gt;Details of the downloads are here&lt;/a&gt;, and &lt;a href="http://msdn.microsoft.com/en-us/vstudio/products/cc533447.aspx"&gt;information on what SP1 brings is here&lt;/a&gt;. The big items for me are the Entity Framework and the performance improvements in LINQ.&lt;/p&gt;  &lt;p&gt;However, before you go rushing off to install SP1 there are some caveats. If you've been running the beta &lt;a href="http://blog.hinshelwood.com/"&gt;Martin Hinshelwood&lt;/a&gt; has &lt;a href="http://blog.hinshelwood.com/archive/2008/08/12/updating-to-visual-studio-2008-sp1.aspx"&gt;some advice&lt;/a&gt; and has also run in to &lt;a href="http://blog.hinshelwood.com/archive/2008/08/12/problems-with-team-explorer-after-installed-visual-studio-2008-sp1.aspx"&gt;problems running the Team Foundation Server SP1 install&lt;/a&gt; too.&lt;/p&gt;  &lt;p&gt;Once you've installed the Service Pack you might want to download the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=355c80e9-fde0-4812-98b5-8a03f5874e96&amp;amp;displaylang=en"&gt;Enhancements Training Kit&lt;/a&gt; in order to learn what's new.&lt;/p&gt;  &lt;p&gt;Finally, if you have Visual Studio 2008 Standard edition or above (not including trials) you can download the &lt;a href="http://www.axialis.com/download/iwlite.html"&gt;IconWorkshop Lite&lt;/a&gt; from &lt;a href="http://www.axialis.com"&gt;Axialsis&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:8b800675-0cba-4fb5-aafc-993c8a7918a7" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Visual%20Studio" rel="tag"&gt;Visual Studio&lt;/a&gt;,&lt;a href="http://technorati.com/tags/sp1" rel="tag"&gt;sp1&lt;/a&gt;,&lt;a href="http://technorati.com/tags/vs2008" rel="tag"&gt;vs2008&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Visual%20Studio%202008" rel="tag"&gt;Visual Studio 2008&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Team%20Foundation%20Server" rel="tag"&gt;Team Foundation Server&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/3331.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/08/12/3331.aspx</guid>
            <pubDate>Tue, 12 Aug 2008 22:23:06 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/3331.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/08/12/3331.aspx#feedback</comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/3331.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Mixins in .NET (again)</title>
            <link>http://blog.colinmackay.net/archive/2008/08/10/3302.aspx</link>
            <description>&lt;p&gt;A while ago I wrote about &lt;a href="http://blog.colinmackay.net/archive/2008/02/24/1895.aspx" target="_blank"&gt;Mixins in C# 3.0&lt;/a&gt;, at the time I was saying that you can get some of the functionality, but not all, from some of the new language features in C#3.0. The solution is a bit of a fudge because the language doesn't support the concept. I've been looking at &lt;a href="http://www.remobjects.com/product/page.asp?id={E10F7F5C-AE94-4833-9E4B-2EDD5ED69768}" target="_blank"&gt;Oxygene&lt;/a&gt; recently and it has some language features that go a bit further than C# does and will support greater mixin-like functionality which it calls interface delegation. &lt;/p&gt;  &lt;p&gt;Interface delegation is again a bit of a fudge, but not quite like C#. In this case the language supports this mixin-like functionality and the fudge happens in the compiler. Let's take the class hierarchy that I used the last time:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a title="Class-Diagram-2 by Colin  Angus Mackay, on Flickr" href="http://www.flickr.com/photos/colinangusmackay/2287423942/"&gt;&lt;img height="405" alt="Class-Diagram-2" src="http://farm3.static.flickr.com/2112/2287423942_1be2458fac_o.png" width="658" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In Oxygene the Dog class looks like this:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;interface&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;D&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;=&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;,&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;,&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;f&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;c&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;D&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;x&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;f&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;c&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;D&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;x&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;protected&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;From this we can see that &lt;strong&gt;Dog&lt;/strong&gt; inherits from &lt;strong&gt;Mammal&lt;/strong&gt; and implements &lt;strong&gt;IRun&lt;/strong&gt; and &lt;strong&gt;ISwim&lt;/strong&gt;. The &lt;strong&gt;IRun&lt;/strong&gt; interface has one method (&lt;strong&gt;Run&lt;/strong&gt;), and the &lt;strong&gt;ISwim&lt;/strong&gt; interface has only one method also (&lt;strong&gt;Swim&lt;/strong&gt;). Of course, there could be as many methods and properties as you like.&lt;/p&gt;

&lt;p&gt;The C# version of the Dog class, as produced by Reflector, looks like this:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;D&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;,&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;,&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;{&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="rem"&gt;// Fields&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;x&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;f&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;c&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;D&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;x&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;f&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;c&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;D&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="rem"&gt;// Methods&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;{&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;f&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;c&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;D&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;}&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;{&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;I&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;f&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;c&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;D&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;w&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;}&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;}&lt;/pre&gt;

&lt;p&gt;As you can see, there are two private fields holding a reference to the appropriate mixin, in each of the methods the responsibility for carrying out the action is delegated to the appropriate surrogate mixin object.&lt;/p&gt;

&lt;p&gt;What you will also notice is that you still have to instantiate the surrogate mixin objects. Under normal circumstances that would be in the constructor. If it were a real mixin you wouldn't have the option as the mixin would be created at the same time as the object it is used with. In fact, the mixin would be &lt;em&gt;mixed in&lt;/em&gt; as part of the object itself. So, perhaps interface delegates gives you slightly greater power than with a real mixin as you could reuse the surrogate mixin object. Then again, would you want to? I've not been able to think of a scenario where I would, but perhaps it could be useful.&lt;/p&gt;

&lt;p&gt;I'd like to see interface delegates in C# at some point in the future (sooner rather than later). In fact, I'd like to see proper mixin functionality, but I recon that will require changes to the CLR to support multiple inheritance. In the meantime, I think I'll have to write some sort of snippet in C# to quickly generate the code that Oxygene gives me in one line. Either that or start writing in Oxygene... Now, there's a thought!&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:c4866e66-ce36-4e3d-a1b1-4a4c4b588b76" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Oxygene" rel="tag"&gt;Oxygene&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C#" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/interface%20delegates" rel="tag"&gt;interface delegates&lt;/a&gt;,&lt;a href="http://technorati.com/tags/mixin" rel="tag"&gt;mixin&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/3302.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/08/10/3302.aspx</guid>
            <pubDate>Sun, 10 Aug 2008 23:55:22 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/3302.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/08/10/3302.aspx#feedback</comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/3302.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Crazy Extension Methods Redux (with Oxygene)</title>
            <link>http://blog.colinmackay.net/archive/2008/08/07/3260.aspx</link>
            <description>&lt;p&gt;Back in April I blogged about a &lt;a href="http://blog.colinmackay.net/archive/2008/04/16/2253.aspx" target="_blank"&gt;crazy thing you can do with extension methods in C#3.0&lt;/a&gt;. At the time I was adamant that it was a bad idea. I still think it is a bad idea, however, my thoughts have evolved a little since then and I have, possibly a solution to my hesitance to use said crazy feature.&lt;/p&gt;  &lt;p&gt;So, if you can't be bothered to click the link, here is a quick recap. You can create an extension method and call it on a null reference and it will NOT throw a &lt;strong&gt;NullReferenceException&lt;/strong&gt; like a real method call would. At the time I was saying it was not best practice because it breaks the semantics of the &lt;a href="http://msdn.microsoft.com/en-gb/library/6zhxzbds.aspx" target="_blank"&gt;dot operator&lt;/a&gt; which is used for member access.&lt;/p&gt;  &lt;p&gt;Last night, I attended an excellent talk by Barry Carr on &lt;a href="http://www.remobjects.com/product/?id={DC0A9947-5FED-4D34-8CC8-F2DCFA87A1FE}" target="_blank"&gt;Oxygene&lt;/a&gt;, an Object Pascal based language that targets the .NET Framework. Oxygene has a very interesting feature, it has a special operator for dealing with calls on a reference that might be null. If that language can do it, what's so wrong with the functionality that Extension methods potentially give? Semantics. Notice that I said that Oxygene has "a special operator". It doesn't use the dot operator. The dot operator still breaks if the reference is null. It has a &lt;a href="http://wiki.remobjects.com/wiki/Colon_Operator" target="_blank"&gt;colon operator&lt;/a&gt;. In this case if the reference is null (or nil as it is called in Oxygene) then the call to the method doesn't happen. No exception is thrown.&lt;/p&gt;  &lt;p&gt;For example. Here is the code with the regular dot operator:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;strong&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;A&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt;=&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;b&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;W&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="str"&gt;'The string length is {0}'&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;,&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g.L&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;And the result is that the &lt;strong&gt;NullReferenceException&lt;/strong&gt; is thrown:&lt;/p&gt;

&lt;p&gt;&lt;a title="NullReferenceException by Colin  Angus Mackay, on Flickr" href="http://www.flickr.com/photos/colinangusmackay/2741458987/"&gt;&lt;img height="333" alt="NullReferenceException" src="http://farm3.static.flickr.com/2233/2741458987_8e2a47474a_o.png" width="894" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the code with the colon operator:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;strong&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;A&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;p&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;var&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt;=&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;b&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;W&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="str"&gt;'The string length is {0}'&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;,&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;:&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/pre&gt;

&lt;p&gt;And the result is that the program works, it just didn't call the property Length as there was nothing to call it on:&lt;/p&gt;

&lt;p&gt;&lt;a title="Result by Colin  Angus Mackay, on Flickr" href="http://www.flickr.com/photos/colinangusmackay/2742296104/"&gt;&lt;img height="363" alt="Result" src="http://farm4.static.flickr.com/3019/2742296104_c42882aee0_o.png" width="702" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point I really would like to show you what this looks like in Reflector to show you what is going on under the hood, however, I get a message that says "This item is obfuscated and can not be translated" and the code afterwards isn't quite right. However, the crux of it is like this in C#:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;int? length;
    &lt;br /&gt;if (myString != null)

    &lt;br /&gt;    length = myString.Length;

    &lt;br /&gt;Console.WriteLine("The string length is {0}", length);&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, back to these extension methods. After seeing this I was thinking that perhaps my total unacceptablity of allowing a null reference to be used with an extension method was perhaps incorrect. In a normal situation with an accidental null reference exception being used the &lt;strong&gt;NullReferenceException&lt;/strong&gt; wouldn't be thrown at the point of the method call (after all, the null reference is actually being passed in as the first parameter in an extension method), but somewhere in the method itself. Normal good practice would place a guard block at the start of the method so that it would be caught immediately.&lt;/p&gt;

&lt;p&gt;However, what if you wanted to create similar functionality to the colon operator in Oxygene and have it ignore the null reference and do nothing? Well, my advice would be to create a naming convention for your extension methods to show that null references will be ignored. That way you can get the functionality with a slight semantic fudge of the dot operator. Of course, you still have to do the work and set up guard blocks to handle the null situation yourself in the extension method.&lt;/p&gt;

&lt;p&gt;Here's an example:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;P&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;{&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;string&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;[&lt;span class="kwrd"&gt;&lt;/span&gt;]&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;{&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;=&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;W&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="str"&gt;"The string length is {0}"&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;,&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;m&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;S&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;N&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;b&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;C&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;R&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;d&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;}&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;}&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;M&lt;span class="kwrd"&gt;&lt;/span&gt;y&lt;span class="kwrd"&gt;&lt;/span&gt;E&lt;span class="kwrd"&gt;&lt;/span&gt;x&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;i&lt;span class="kwrd"&gt;&lt;/span&gt;o&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;s&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;{&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;?&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;N&lt;span class="kwrd"&gt;&lt;/span&gt;u&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;b&lt;span class="kwrd"&gt;&lt;/span&gt;l&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;{&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;(&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;=&lt;span class="kwrd"&gt;&lt;/span&gt;=&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;)&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;a&lt;span class="kwrd"&gt;&lt;/span&gt;r&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;.&lt;span class="kwrd"&gt;&lt;/span&gt;L&lt;span class="kwrd"&gt;&lt;/span&gt;e&lt;span class="kwrd"&gt;&lt;/span&gt;n&lt;span class="kwrd"&gt;&lt;/span&gt;g&lt;span class="kwrd"&gt;&lt;/span&gt;t&lt;span class="kwrd"&gt;&lt;/span&gt;h&lt;span class="kwrd"&gt;&lt;/span&gt;;&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&lt;/span&gt;}&lt;span class="kwrd"&gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;span class="kwrd"&gt;&lt;/span&gt;}&lt;span class="kwrd"&gt;&lt;/span&gt;&lt;/pre&gt;

&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f636dd39-cbf7-49f5-acba-d8eae1c060a7" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/extension%20methods" rel="tag"&gt;extension methods&lt;/a&gt;,&lt;a href="http://technorati.com/tags/dot%20operator" rel="tag"&gt;dot operator&lt;/a&gt;,&lt;a href="http://technorati.com/tags/colon%20operator" rel="tag"&gt;colon operator&lt;/a&gt;,&lt;a href="http://technorati.com/tags/c#" rel="tag"&gt;c#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/oxygene" rel="tag"&gt;oxygene&lt;/a&gt;,&lt;a href="http://technorati.com/tags/semantics" rel="tag"&gt;semantics&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/3260.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/08/07/3260.aspx</guid>
            <pubDate>Thu, 07 Aug 2008 20:45:07 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/3260.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/08/07/3260.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/3260.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Oxygene talk in Dundee</title>
            <link>http://blog.colinmackay.net/archive/2008/08/07/3257.aspx</link>
            <description>&lt;p&gt;Last night's talk in Dundee on &lt;a href="http://www.remobjects.com/product/?id={DC0A9947-5FED-4D34-8CC8-F2DCFA87A1FE}" target="_blank"&gt;Oxygene&lt;/a&gt; was excellent.&lt;/p&gt;  &lt;p&gt;My journey up was a little fraught as an accident on the A80 meant that it took me 1h15m to travel the 20 miles from Glasgow to Stirling. By that point was running late and had 45 minutes to cover the last 55 miles. In the end I arrive 15 minutes late, but that was okay because they hadn't actually started yet.&lt;/p&gt;  &lt;p&gt;The journey back afterwards was a bit hellish too because the rain was coming down hard and the M80 between Cumbernauld and Stirling doesn't seem to be able to drain water quickly enough. Even reducing my speed I was aquaplaning every few hundred metres.&lt;/p&gt;  &lt;p&gt;Anyway, &lt;a href="http://www.remobjects.com/product/?id={DC0A9947-5FED-4D34-8CC8-F2DCFA87A1FE}" target="_blank"&gt;Oxygene&lt;/a&gt;, if you don't know, is a Object Pascal based language that targets the .NET Framework. In terms of features it contains a lot of things that would be beneficial to C# such as interface delegates, parallel coding constructs and null handling.&lt;/p&gt;  &lt;p&gt;I will be blogging in more detail about some of these features as I plan to look further in to this language. &lt;/p&gt;&lt;img src="http://blog.colinmackay.net/aggbug/3257.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/08/07/3257.aspx</guid>
            <pubDate>Thu, 07 Aug 2008 13:28:13 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/3257.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/08/07/3257.aspx#feedback</comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/3257.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Tip of the Day #8 (string performance)</title>
            <link>http://blog.colinmackay.net/archive/2008/08/04/3221.aspx</link>
            <description>&lt;p&gt;Concatenating strings in .NET can be very easy. There is the overloaded + operator that makes &lt;strong&gt;stringA + stringB + stringC&lt;/strong&gt; statements very easy to write. But, it isn't very performant. The reason is that strings are immutable, and concatenating strings in this way causes lots of short-lived objects to be created and thrown away, which in turn causes the garbage collector to run frequently.&lt;/p&gt;  &lt;p&gt;There are two better ways in .NET to concatenate strings. One is to use the &lt;strong&gt;string.Concat()&lt;/strong&gt; method. The other is to use the &lt;strong&gt;StringBuilder&lt;/strong&gt; class. They both perform better than adding strings together, but you still have to know when to use each. &lt;/p&gt;  &lt;p&gt;According to this article on "&lt;a href="http://www.codeproject.com/KB/cs/stringperf.aspx" target="_blank"&gt;Performance considerations for strings in C#&lt;/a&gt;" &lt;strong&gt;string.Concat()&lt;/strong&gt; is good up to 600 strings. But, only if you have 600 strings to concatenate in a single statement. &lt;strong&gt;StringBuilder&lt;/strong&gt; is better if you have more than 600 strings to concatenate, but you can do so over multiple statements. In reality, I think the benefits of appending strings over multiple statements with &lt;strong&gt;StringBuilder&lt;/strong&gt; will work out better even with much less than 600 strings because to get the performance out of &lt;strong&gt;string.Concat()&lt;/strong&gt; you'll have to perform some form of setup operation to line all those strings up - and that will take time.&lt;/p&gt;  &lt;p&gt;So, today's tip is don't use the plus operator to combine strings except in quick / throw-away applications. Use &lt;strong&gt;string.Concat()&lt;/strong&gt; or &lt;strong&gt;StringBuilder&lt;/strong&gt; instead.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:f0529d1c-f618-4773-828b-706583c2de62" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/string" rel="tag"&gt;string&lt;/a&gt;,&lt;a href="http://technorati.com/tags/concatenation" rel="tag"&gt;concatenation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/concat" rel="tag"&gt;concat&lt;/a&gt;,&lt;a href="http://technorati.com/tags/stringbuilder" rel="tag"&gt;stringbuilder&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/3221.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/08/04/3221.aspx</guid>
            <pubDate>Mon, 04 Aug 2008 12:00:54 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/3221.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/08/04/3221.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/3221.aspx</wfw:commentRss>
        </item>
        <item>
            <title>What's New in Visual Studio 2008 Service Pack 1</title>
            <link>http://blog.colinmackay.net/archive/2008/07/31/3162.aspx</link>
            <description>&lt;p&gt;Finally, Microsoft have a date for an event in Scotland. It is on 16th of October in their new offices in Waverley Gate, Edinburgh. Here are the details:&lt;/p&gt;  &lt;p&gt;[&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032384614&amp;amp;Culture=en-GB" target="_blank"&gt;Register for the event here&lt;/a&gt;]&lt;/p&gt;  &lt;p&gt;16 October 2008 13:30 - 16:15    &lt;br /&gt;Welcome Time: 13:00&lt;/p&gt;  &lt;p&gt;Microsoft Scotland   &lt;br /&gt;Waverley Gate    &lt;br /&gt;2-4 Waterloo Place     &lt;br /&gt;Edinburgh EH1 3EG&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Event Overview&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Timings&lt;/strong&gt;    &lt;br /&gt;13.00 for 13.30 Registration &lt;/p&gt;  &lt;p&gt;13.30 - 14.45 Session 1&lt;/p&gt;  &lt;p&gt;14.45 - 15.00 break &lt;/p&gt;  &lt;p&gt;15.00 -16.15 Session 2&lt;/p&gt;  &lt;p&gt;16.15 close&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Overview:&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;“&lt;/em&gt;Service Pack? We’re calling it a Service Pack? Are you kidding??!?!”&lt;/p&gt;  &lt;p&gt;Visual Studio 2008 Service Pack 1 will release later in 2008 alongside .NET Framework V3.5 Service Pack 1 and, together, they represent a significant upgrade to Visual Studio 2008. There are enhancements across many areas of the .NET Framework such as data access, windows application development and web development and there are also corresponding changes in the development environment to support the new framework features.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;i&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Session 1:&lt;/b&gt;&lt;b&gt; What’s New for Web &amp;amp; Windows Development?&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Here we’ll explore the changes to web and windows development with Service Pack 1. In the web space, we’ll take a look at the new controls added to ASP.NET for easy playback of media and Silverlight content and we’ll take a good look at the new Dynamic Data framework for quick “scaffolding” of a web site. In the Windows world, we’ll look at the new capabilities of Windows Presentation Foundation V3.5 Sp1 and the new, smaller, subset of the .NET Framework in the .NET Client Profile that makes deployment of WPF applications much easier.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Session 2:&lt;/b&gt;&lt;b&gt; What’s New for Data?&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;The ADO.NET team have been busy for Service Pack 1 of Visual Studio 2008. There are two major new pieces of functionality – the ADO.NET Entity Framework provides a level of abstraction over your data store with a LINQ-enabled, object-relational-mapping API. The other new piece of functionality, ADO.NET Data Services easily exposes arbitrary data over a RESTful set of web services. In this session, we’ll explore both to give you an idea of what’s happening in data access. We’ll also make a brief mention of the changes around SQL Server 2008 data types and tooling.&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Speaker Biogragphy:&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Mike Taulty&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Mike Taulty, Microsoft:  Mike has been in the team since 2003 and is currently looking at technologies such as Visual Studio 2008 Service Pack 1, Silverlight V2 and SQL Server 2008.  Before joining the Community team, Mike worked in Microsoft's Services group as a developer consultant focused on helping ISVs and Enterprises develop their applications.  Prior to joining Microsoft, Mike spent the previous nine years working as a software developer for a number of different software houses, end-users and consultancies, making use of various operating systems, databases and what used to be called 'middleware’.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/"&gt;&lt;b&gt;Read Mike's blog&lt;/b&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Eric Nelson&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;After many years of developing on UNIX/RDBMS (and being able to get mortgages) Eric joined Microsoft in 1996 as a Technical Evangelist (and stopped being able to get mortgages due to his new 'unusual job title' in the words of his bank manager). He has spent most of his time working with ISVs to help them architect solutions which make use of the latest Microsoft technologies - from the beta of ASP 1.0 through to ASP.NET, from MTS to WCF/WF and from the beta of SQL Server 6.5 through to SQL Server 2008. Along the way he has met lots of smart and fun developers - and been completely stumped by many of their questions!&lt;/p&gt;  &lt;p&gt;In July 2008 he switched role from an Application Architect to a Developer Evangelist in the Developer and Platform Group. Currently Eric’s interests include digging into LINQ to Entities, ADO.NET Data Services and switching from C# to Visual Basic development.&lt;/p&gt;  &lt;p&gt;At home, he battles rat infestations, comes second to the family dog and uses any spare moments he has after 10pm to team up and play online with and against friends - keep an eye out for 'erknel' and say 'hi'&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/ericnel/"&gt;Read Eric’s blog&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;[&lt;a href="http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032384614&amp;amp;Culture=en-GB" target="_blank"&gt;Register for the event here&lt;/a&gt;]&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2676a02e-b426-4088-a1b6-9f757e9ef314" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/msdn" rel="tag"&gt;msdn&lt;/a&gt;,&lt;a href="http://technorati.com/tags/microsoft" rel="tag"&gt;microsoft&lt;/a&gt;,&lt;a href="http://technorati.com/tags/visual%20studio" rel="tag"&gt;visual studio&lt;/a&gt;,&lt;a href="http://technorati.com/tags/sp1" rel="tag"&gt;sp1&lt;/a&gt;,&lt;a href="http://technorati.com/tags/software%20development" rel="tag"&gt;software development&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/3162.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/07/31/3162.aspx</guid>
            <pubDate>Thu, 31 Jul 2008 13:18:26 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/3162.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/07/31/3162.aspx#feedback</comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/3162.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Tip of the Day #7 (SysInternals)</title>
            <link>http://blog.colinmackay.net/archive/2008/07/30/3140.aspx</link>
            <description>&lt;p&gt;I've visited the &lt;a target="_blank" href="http://technet.microsoft.com/en-us/sysinternals/default.aspx"&gt;&lt;strong&gt;SysInternals&lt;/strong&gt;&lt;/a&gt; site a few times over the course of my career because of some strange problem that I just couldn't track down. The amount of information about what is actually happening on your system that the &lt;a target="_blank" href="http://technet.microsoft.com/en-us/sysinternals/default.aspx"&gt;&lt;strong&gt;SysInternals&lt;/strong&gt;&lt;/a&gt; tools provide is phenomenal. The site was run by &lt;a href="http://blogs.technet.com/markrussinovich/about.aspx"&gt;Mark Russinovich&lt;/a&gt; and Bryce Cogswell until they got hired by Microsoft. However, the tools are still available and being updated, only now they are hosted by Microsoft themselves.&lt;/p&gt;
&lt;p&gt;So, today's tip is to visit the &lt;a target="_blank" href="http://technet.microsoft.com/en-us/sysinternals/default.aspx"&gt;&lt;strong&gt;SysInternals&lt;/strong&gt;&lt;/a&gt; page on &lt;a target="_blank" href="http://www.microsoft.com/en/gb/default.aspx"&gt;Microsoft&lt;/a&gt;'s &lt;a target="_blank" href="http://technet.microsoft.com/en-gb/default.aspx"&gt;TechNet&lt;/a&gt; site and familiarise yourself with what is available. You might find that one day it will save you hours of frustration.&lt;/p&gt;&lt;img src="http://blog.colinmackay.net/aggbug/3140.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/07/30/3140.aspx</guid>
            <pubDate>Wed, 30 Jul 2008 14:47:33 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/3140.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/07/30/3140.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/3140.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Scottish Developers July Newsletter</title>
            <link>http://blog.colinmackay.net/archive/2008/07/28/3125.aspx</link>
            <description>&lt;h1&gt;Welcome&lt;/h1&gt;  &lt;p&gt;We are now in the middle of summer, however as I write this over a period of several days I can tell you that it has been chucking it down and it has been roasting.&lt;/p&gt;  &lt;p&gt;If you are interested in SQL Server, the &lt;a href="http://www.sqlbits.com/"&gt;SQL Bits III&lt;/a&gt; conference (13&lt;sup&gt;th&lt;/sup&gt; September) has now opened registration and session voting. They've opted to allow people to register for the event before they've even finalised which sessions are going to run. So, you could take pot luck and register now, or you can wait and see and take your chances that there will be places left.&lt;/p&gt;  &lt;p&gt;I would have also been advising you of the &lt;a href="http://altdotnet.org/events/uk"&gt;ALT.NET conference in London&lt;/a&gt; (also 13&lt;sup&gt;th&lt;/sup&gt; September) but when I last checked it was full already! Delegate Registration had only been open for a few days. If you've not signed up already there is always the &lt;a href="http://tech.groups.yahoo.com/group/glasgow_altdotnet_usersgroup/"&gt;Glasgow ALT.NET User Group&lt;/a&gt;. Added to that ALT.NET supporter Paul Cowan will be talking at Scottish Developers in Glasgow in September.&lt;/p&gt;  &lt;p&gt;We also have exciting news that we have finally (and formally) merged with the North East Scotland .NET User Group. This gives us a permanent presence in Dundee. It also means that we should be able to put on events in Aberdeen from time-to-time. If you are from either city then get in touch and let us know what you'd like us to be putting on for you.&lt;/p&gt;  &lt;p&gt;Our new committee is as follows: Colin Mackay (Chairman), Gary Short (Secretary), Frank Kerrigan (Treasurer), Barry Carr (UG Coordinator) and Craig Murphy (UG Coordinator).&lt;/p&gt;  &lt;p&gt;As always, we are on the look out for new speakers. If you would like the opportunity to do a presentation on a software development topic from 10 minutes to 90 minutes then get in touch with me at &lt;a href="mailto:colin@scottishdevelopers.com"&gt;colin@scottishdevelopers.com&lt;/a&gt;. If you are interested, but don't think you have the skills to stand up and talk to a group of developers Microsoft are running some technical speaking training courses for those that want to speak to user groups. The courses will be held in Reading. The first is on 29th August. If you are interested drop me an email.&lt;/p&gt;  &lt;p&gt;Regards,   &lt;br /&gt;Colin Mackay, Chairman, Scottish Developers&lt;/p&gt;  &lt;h1&gt;Events&lt;/h1&gt;  &lt;p class="EventHeader"&gt;&lt;strong&gt;6-August-2008 @ 19:00 in Dundee (Scottish Developers)&lt;/strong&gt;    &lt;br /&gt;&lt;a href="http://www.scottishdevelopers.com/modules/extcal/event.php?event=83"&gt;An Introduction to Oxygene and its parallel coding features&lt;/a&gt;    &lt;br /&gt;FREE - Registration optional&lt;/p&gt;  &lt;p&gt;Oxygene (formerly known as Chrome) is an advance .NET (and Mono) language by RemObjects influenced by Object Pascal. Oxygene has all the features of C# plus several more powerful features unique to itself. These include: Interface Delegation which provide a similar behaviour to Mixins; A null safe member access operator; Full support for "Design by Contract"; Virtual static members and Virtual constructors that can make writing object factories a breeze. &lt;/p&gt;  &lt;p class="EventHeader"&gt;&lt;strong&gt;9-September-2008 @ 18:30 in Glasgow (Scottish Developers)&lt;/strong&gt;    &lt;br /&gt;&lt;a href="http://www.scottishdevelopers.com/modules/extcal/event.php?event=69"&gt;An Overview of ALT.NET Technologies&lt;/a&gt;    &lt;br /&gt;FREE - Registration optional&lt;/p&gt;  &lt;p class="EventDetail"&gt;Most of the patterns and practices that come out of Redmond A.K.A Microsoft are purely to get a response from attendees of conferences like MIX. The same old drag and drop demo ware is both untestable and unmaintainable. Examples of such demo ware are the CAB application block, SCSF (smart client software factory), ObjectBuilder (a very poor IOC container) and the Entity Framework which many believe to be the catalyst for the ALT.NET movement. The recent ASP.NET MVC framework appears to be an acknowledgement from Microsoft that they want to embrace some of the ALT.NET concepts. The discussion will outline some of the following techniques and frameworks by way of a code review. Attendees are encouraged to participate with questions throughout the duration of the discussion. Some of he concepts and frameworks include: * Test Driven Development (TDD) * Nhibernate (Object Relational Mapper) * Castle Windsor (Inversion Of Control or Dependency Injection) * AOP (Aspect Oriented Programming) * ASP.NET MVC Framework * JQuery (a write less JavaScript library from a very talented team). &lt;/p&gt;  &lt;p class="EventHeader"&gt;&lt;strong&gt;8-October-2008 @ 19:00 in Edinburgh (BCS)&lt;/strong&gt;    &lt;br /&gt;&lt;a href="http://www.edinburgh.bcs.org/events/081008.htm"&gt;The Three Ghosts of Microsoft Security&lt;/a&gt;    &lt;br /&gt;FREE - Registration Required&lt;/p&gt;  &lt;p class="EventDetail"&gt;Taking efficiency one step further - F# Microsoft Research describes F# as "a scripted/functional/imperative/object-oriented programming language". Combining all those aspects in one language is certainly not an easy task, but they've done a good job of it. F# is interesting both as a language to actually consider for your projects and as a source of features that might make it into the mainstream .NET languages tomorrow. The session uses many examples to give you a good general overview of F#. To complement the introductory session, Oliver is going to show some more advanced samples from his talk “Data Handling in F#” and there will also be room for Q&amp;amp;A as well as discussion. &lt;/p&gt;  &lt;h1&gt;Further Afield&lt;/h1&gt;  &lt;p&gt;&lt;strong&gt;September:     &lt;br /&gt;&lt;/strong&gt;  &lt;a href="http://www.sqlbits.com/"&gt;SQL Bits III&lt;/a&gt; (Hatfield)    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;October:&lt;/strong&gt;    &lt;br /&gt;  &lt;a href="http://www.scottishdevelopers.com/modules/extcal/event.php?event=72"&gt;Frank Kerrigan talks about SSIS&lt;/a&gt; (Glasgow)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;November:     &lt;br /&gt;&lt;/strong&gt;  &lt;a href="http://www.vbug.net/News/June-2008/VBUGs-Annual-Conference-2008.aspx"&gt;VBUG Conference&lt;/a&gt; (Reading)    &lt;br /&gt;  &lt;a href="http://www.microsoft.com/emea/teched2008/developer/default.aspx"&gt;TechEd Developers&lt;/a&gt; (Barcelona)    &lt;br /&gt;  &lt;a href="http://www.developerday.co.uk/ddd/default.asp"&gt;Developer! Developer! Developer!&lt;/a&gt; (Reading)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;December:&lt;/strong&gt;    &lt;br /&gt;  &lt;a href="http://www.scottishdevelopers.com/modules/extcal/event.php?event=74"&gt;Andrew Westgarth on ASP.NET development on IIS7&lt;/a&gt; (Glasgow)&lt;/p&gt;  &lt;h1&gt;Sponsor's message&lt;/h1&gt;  &lt;p&gt;&lt;a href="http://www.sqlknowhow.com/?Referrer=ScotDev321"&gt;&lt;strong&gt;SQL Know How&lt;/strong&gt;&lt;/a&gt; are offering top quality SQL Server training courses at excellent value. Not only is the price great, but by entering the site from the links in this newsletter or on the Scottish Developer's website you'll get an additional 5% off the price. Their upcoming courses include the following&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sqlknowhow.com/events/sqlsk1.aspx?Referrer=ScotDev321"&gt;&lt;strong&gt;Best Practices in Performance and Availability for SQL Server 2005/2008&lt;/strong&gt;&lt;/a&gt;     &lt;br /&gt;Kimberly L. Tripp and Paul S. Randal 1st - 3rd September 2008 Hatfield, Hertfordshire&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sqlknowhow.com/events/sqlsk2.aspx?Referrer=ScotDev321"&gt;&lt;strong&gt;Indexing for Performance in SQL Server 2000/2005/2008&lt;/strong&gt;&lt;/a&gt;     &lt;br /&gt;Kimberly L. Tripp and Paul S. Randal 8th - 9th September 2008 Edinburgh&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sqlknowhow.com/events/sqlbible1.aspx?Referrer=ScotDev321"&gt;&lt;strong&gt;Smart Database Design&lt;/strong&gt;&lt;/a&gt;     &lt;br /&gt;Paul Nielsen 22nd - 23rd September 2008 Hatfield, Hertfordshire&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sqlknowhow.com/events/sqlbible2.aspx?Referrer=ScotDev321"&gt;&lt;strong&gt;Smart Database Design&lt;/strong&gt;&lt;/a&gt;     &lt;br /&gt;Paul Nielsen 29th - 30th September 2008 Edinburgh&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sqlknowhow.com/events/insidesql1.aspx?Referrer=ScotDev321"&gt;&lt;strong&gt;SQL Server Data Storage Formats: Internals, Performance and Best Practices&lt;/strong&gt;&lt;/a&gt;     &lt;br /&gt;Kalen Delaney 3rd November 2008 Harpenden, Hertfordshire&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sqlknowhow.com/events/insidesql2.aspx?Referrer=ScotDev321"&gt;&lt;strong&gt;SQL Server Concurrency Control: Locking, Blocking and Row Versioning&lt;/strong&gt;&lt;/a&gt;     &lt;br /&gt;Kalen Delaney 4th November 2008 Harpenden, Hertfordshire&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.sqlknowhow.com/events/insidesql3.aspx?Referrer=ScotDev321"&gt;&lt;strong&gt;SQL Server Data Internals and Tuning&lt;/strong&gt;&lt;/a&gt;     &lt;br /&gt;Kalen Delaney 5th - 7th November 2008 Harpenden, Hertfordshire    &lt;/p&gt;&lt;img src="http://blog.colinmackay.net/aggbug/3125.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/07/28/3125.aspx</guid>
            <pubDate>Mon, 28 Jul 2008 23:28:18 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/3125.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/07/28/3125.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/3125.aspx</wfw:commentRss>
        </item>
        <item>
            <title>How I got started in Software Development?</title>
            <link>http://blog.colinmackay.net/archive/2008/07/26/3102.aspx</link>
            <description>&lt;p&gt;There is a meme going around at the moment and I thought I'd join in even although I've not been specifically tagged by it, it looks good fun. I spotted it on &lt;a href="http://haacked.com/" target="_blank"&gt;Phil Haak's blog&lt;/a&gt; &lt;a href="http://haacked.com/archive/2008/07/25/how-i-got-started-in-software-development.aspx" target="_blank"&gt;with his response&lt;/a&gt;.&lt;/p&gt;  &lt;h1&gt;How old were you when you started programming?&lt;/h1&gt;  &lt;p&gt;I was 8 years old.&lt;/p&gt;  &lt;h1&gt;How did you get started in programming?&lt;/h1&gt;  &lt;p&gt;When my dad bought a ZX Spectrum in 1983 (It was a Mark II, 48K RAM). I started by typing in programs from the manuals, then by creating my own programs. One of the first I remember creating was to stop my sister using the computer. She was younger than me and the program was something like this:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="con" size="2"&gt;10 PRINT "How old are you?"       &lt;br /&gt;20 INPUT a        &lt;br /&gt;30 IF a &amp;lt; 8 THEN PRINT "You are too young to use this computer."; GO TO 10&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;h1&gt;What was your first language?&lt;/h1&gt;  &lt;p&gt;ZX Spectrum Basic&lt;/p&gt;  &lt;h1&gt;What was the first real program that you wrote?&lt;/h1&gt;  &lt;p&gt;The first real program that I wrote as part of a job was a tool to summarise and format certain data in a database. What today would be handled by a few drag &amp;amp; drop operations and some mouse clicks in SQL Server Reporting Services took me about a week or so back then. It was written in a language called Magik (yes, with a K)&lt;/p&gt;  &lt;h1&gt;What languages have you used since you started programming?&lt;/h1&gt;  &lt;p&gt;Well various flavours of BASIC (ZX Spectrum, BBC, Visual Basic, VBA, etc.), COMAL (used by my high school), PASCAL, C/C++, COBOL, Magik, javascript, C#. There are probably a whole slew of other languages that I've touched over the years but not spent any significant time with that I've missed out here.&lt;/p&gt;  &lt;h1&gt;If you knew then what you know now, would you have started programming?&lt;/h1&gt;  &lt;p&gt;Yes, I would still have started programming. I probably would have done it a lot better though. There are a lot of things I've learned along the way that I wish I knew earlier. But, then again, if I never made those mistakes what lessons would I be learning? I guess I would be answering this questions pretty much the same way, but thinking of a different set of mistakes. Or would I? Maybe, since I didn't make those mistakes in the first place I would end up being an incredibly arrogant insufferable arsehole.&lt;/p&gt;  &lt;h1&gt;If there is one thing you learned along the way that you would tell new developers, what would it be?&lt;/h1&gt;  &lt;p&gt;Last year, I interviewed for 3 months to hire a developer. From that, the one major thing I think people need to understand is that in software development you must continue to learn constantly. I was interviewing candidates with 10+ years experience that had pretty much never learned anything since leaving university. Sure, they were using new languages since leaving, but they never learned about how to really use this fancy new object oriented language, or how to defend against SQL Injection Attacks. Most of them couldn't even write a &lt;a href="http://www.codinghorror.com/blog/archives/000781.html" target="_blank"&gt;fizz-buzz program&lt;/a&gt; &lt;a href="http://www.hanselman.com/blog/YouCantTeachHeightMeasuringProgrammerCompetenceViaFizzBuzz.aspx" target="_blank"&gt;for goodness sakes&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;So, my answer would be &lt;strong&gt;&lt;em&gt;life long learning&lt;/em&gt;&lt;/strong&gt;. If you don't want to do it then do something else.&lt;/p&gt;  &lt;h1&gt;&lt;/h1&gt;  &lt;h1&gt;Who do I tag?&lt;/h1&gt;  &lt;p&gt;It is an interesting set of questions, and I'd like to know the answer from the following people:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.craigmurphy.com/blog/" target="_blank"&gt;Craig Murphy&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://garyshortblog.wordpress.com/" target="_blank"&gt;Gary Short&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://weblogs.asp.net/plip/" target="_blank"&gt;Phil Winstanley&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.sturmnet.org/blog/" target="_blank"&gt;Oliver Sturm&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://idunno.org/" target="_blank"&gt;Barry Dorrans&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d3b0982d-a718-481f-aa89-b85505d2213d" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/meme" rel="tag"&gt;meme&lt;/a&gt;,&lt;a href="http://technorati.com/tags/software%20development" rel="tag"&gt;software development&lt;/a&gt;,&lt;a href="http://technorati.com/tags/programming" rel="tag"&gt;programming&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/3102.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/07/26/3102.aspx</guid>
            <pubDate>Sat, 26 Jul 2008 13:14:02 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/3102.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/07/26/3102.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/3102.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Monitoring change in XML data (LINQ to XML series - Part 5)</title>
            <link>http://blog.colinmackay.net/archive/2008/07/19/2985.aspx</link>
            <description>&lt;p&gt;This is the 5th part in a series on LINQ to XML. In this instalment we will look at monitoring changes in XML data in the XML classes added to .NET 3.5.&lt;/p&gt; &lt;p&gt;The &lt;strong&gt;XObject&lt;/strong&gt; class (from which &lt;strong&gt;XElement&lt;/strong&gt; and &lt;strong&gt;XAttribute&lt;/strong&gt;, among others) contains two events that are of interest to anyone wanting to know about changes to the XML data: &lt;strong&gt;Changing&lt;/strong&gt; and &lt;strong&gt;Changed&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The &lt;strong&gt;Changing&lt;/strong&gt; event is triggered prior to a change being applied to the XML data. The &lt;strong&gt;Changed&lt;/strong&gt; event is triggered after the change has been applied.&lt;/p&gt; &lt;p&gt;An example of adding the event handler would be something like this:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;XElement &lt;/span&gt;root = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"root"&lt;/span&gt;);
root.Changed += &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;XObjectChangeEventArgs&lt;/span&gt;&amp;gt;(root_Changed);&lt;/pre&gt;
&lt;p&gt;The above example will trigger for any change that happens in the node the event handler is applied to and any node downstream of it. As the example is applied to the root node this means the event will trigger for any change in the XML data.&lt;/p&gt;
&lt;p&gt;The event handler is supplied an &lt;strong&gt;XObjectChangeEventArgs&lt;/strong&gt; object which contains an &lt;strong&gt;ObjectChange&lt;/strong&gt; property. This is an &lt;strong&gt;XObjectChange&lt;/strong&gt; enum and it lets the code know what type of change happened.&lt;/p&gt;
&lt;p&gt;The sender contains the actual object in the XML data that has changed. &lt;/p&gt;
&lt;h1&gt;Adding an element&lt;/h1&gt;
&lt;p&gt;Take the following example where an element is added to the XML data.&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: #2b91af"&gt;XElement &lt;/span&gt;child = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XElement&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"ChildElement"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"Original Value"&lt;/span&gt;);
root.Add(child);&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;In this case the &lt;strong&gt;ObjectChanged&lt;/strong&gt; is &lt;strong&gt;Add&lt;/strong&gt; and the sender is the &lt;strong&gt;XElement&lt;/strong&gt;: &amp;lt;ChildElement&amp;gt;Original Value&amp;lt;/ChildElement&amp;gt; &lt;/p&gt;
&lt;p&gt;A similar scenario happens when adding an attribute. However, instead of the sender being an &lt;strong&gt;XElement&lt;/strong&gt; it will be an &lt;strong&gt;XAttribute&lt;/strong&gt;.&lt;/p&gt;&lt;pre class="code"&gt;child.Add(&lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;XAttribute&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"TheAttribute"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"Some Value"&lt;/span&gt;));&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;h1&gt;Changing an element value&lt;/h1&gt;
&lt;p&gt;If the value of the element is changed (the bit that currently says "Original Value") then we don't get one event fired. We get two events fired. For example:&lt;/p&gt;&lt;pre class="code"&gt;child.Value = &lt;span style="color: #a31515"&gt;"New Value"&lt;/span&gt;;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;The first event with &lt;strong&gt;ObjectChanged&lt;/strong&gt; set to &lt;strong&gt;Remove&lt;/strong&gt; and the sender set to "Orginal Value" (which is actually an &lt;strong&gt;XText&lt;/strong&gt; object) and the second event with the &lt;strong&gt;ObjectChanged&lt;/strong&gt; set to &lt;strong&gt;Add&lt;/strong&gt; and the sender set to "New Value" (again, this is actually an &lt;strong&gt;XText&lt;/strong&gt; object).&lt;/p&gt;
&lt;h1&gt;Changing an element name&lt;/h1&gt;
&lt;p&gt;If the name of the element is changed then the &lt;strong&gt;ObjectChanged&lt;/strong&gt; property will be set to &lt;strong&gt;Name&lt;/strong&gt; and the sender will be the &lt;strong&gt;XElement&lt;/strong&gt; that has changed. &lt;/p&gt;&lt;pre class="code"&gt;child.Name = &lt;span style="color: #a31515"&gt;"JustTheChild"&lt;/span&gt;;&lt;/pre&gt;
&lt;h1&gt;Changing an attribute name&lt;/h1&gt;
&lt;p&gt;Unlike changing an element value, when the value of an attribute changes the &lt;strong&gt;ObjectChanged&lt;/strong&gt; property will be &lt;strong&gt;Value&lt;/strong&gt; and the sender will be the &lt;strong&gt;XAttribute&lt;/strong&gt;.&lt;/p&gt;&lt;pre class="code"&gt;child.Attribute(&lt;span style="color: #a31515"&gt;"TheAttribute"&lt;/span&gt;).Value = &lt;span style="color: #a31515"&gt;"New Attribute Value"&lt;/span&gt;;&lt;/pre&gt;&lt;pre class="code"&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:43bd53b7-890e-41d1-aea0-9bf6a429e724" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/c#" rel="tag"&gt;c#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.net" rel="tag"&gt;.net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.net%203.5" rel="tag"&gt;.net 3.5&lt;/a&gt;,&lt;a href="http://technorati.com/tags/xml" rel="tag"&gt;xml&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/2985.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/07/19/2985.aspx</guid>
            <pubDate>Sat, 19 Jul 2008 16:57:00 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/2985.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/07/19/2985.aspx#feedback</comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/2985.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>