<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>Professional</title>
        <link>http://blog.colinmackay.net/category/1.aspx</link>
        <description>If you only ever want posts related to software development, computing in general, notices of developer events or any of my articles or presentations subscribe to this feed.</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>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>SQL Server / Visual Studio Install Order</title>
            <link>http://blog.colinmackay.net/archive/2008/08/03/3206.aspx</link>
            <description>&lt;p&gt;Yesterday I paved my laptop in order to upgrade to Windows Vista. I've now started to reinstall everything from scratch again. However, one thing that didn't work out was the installation of SQL Server 2005. No matter what I tried I could not seem to get it to install the SQL Server Management Studio - somehow it was convinced that it already existed. I eventually figured out why.&lt;/p&gt;  &lt;p&gt;I'd installed Visual Studio 2008 first, and as part of that installation it installed SQL Server 2005 Express edition. The express edition does not come with SQL Server Management Studio. When I went to install SQL Server 2005 it refused to install the management studio saying that more up-to-date versions of the tools were already available on the machine. (Well, I suppose some of them were, at least the ones installed by Visual Studio 2008's installer). Running the Service Pack 2 upgrade did not help either. It concluded that the client tools were not valid as part of the upgrade and refused to install them.&lt;/p&gt;  &lt;p&gt;Eventually I came to the conclusion that it would be quicker, given my recent wiping of my laptop to just start afresh again and install things in the correct order. I suppose I was lucky to have that option. I am also lucky that I don't activate Windows until I'm sure everything is installed correctly - after all I do have 30 days to activate Windows. I'd hate to have lost an activation of Windows because of a dodgy install.&lt;/p&gt;  &lt;p&gt;So what is the installation order I've now used that works:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Windows Vista SP1 &lt;/li&gt;    &lt;li&gt;Windows Update (my install required 33 updates) &lt;/li&gt;    &lt;li&gt;SQL Server 2005 &lt;/li&gt;    &lt;li&gt;SQL Server 2005 SP2 &lt;/li&gt;    &lt;li&gt;Visual Studio 2008 &lt;/li&gt; &lt;/ul&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:dc7edcfe-2f0c-4c53-a48d-9c49002cd50a" 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/sql%20server" rel="tag"&gt;sql server&lt;/a&gt;,&lt;a href="http://technorati.com/tags/sql%20server%202005" rel="tag"&gt;sql server 2005&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/visual%20studio%202008" rel="tag"&gt;visual studio 2008&lt;/a&gt;,&lt;a href="http://technorati.com/tags/windows" rel="tag"&gt;windows&lt;/a&gt;,&lt;a href="http://technorati.com/tags/vista" rel="tag"&gt;vista&lt;/a&gt;,&lt;a href="http://technorati.com/tags/windows%20vista" rel="tag"&gt;windows vista&lt;/a&gt;,&lt;a href="http://technorati.com/tags/sql%20server%202005%20express" rel="tag"&gt;sql server 2005 express&lt;/a&gt;,&lt;a href="http://technorati.com/tags/sql%20server%20express" rel="tag"&gt;sql server express&lt;/a&gt;,&lt;a href="http://technorati.com/tags/installation" rel="tag"&gt;installation&lt;/a&gt;,&lt;a href="http://technorati.com/tags/install" rel="tag"&gt;install&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/3206.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/08/03/3206.aspx</guid>
            <pubDate>Sun, 03 Aug 2008 14:02:10 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/3206.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/08/03/3206.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/3206.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Installing SQL Server 2005 on Vista</title>
            <link>http://blog.colinmackay.net/archive/2008/08/03/3200.aspx</link>
            <description>&lt;p&gt;Perhaps this is not so much an issue with installing SQL Server 2005 on Vista, but of the way I install SQL Server 2005 on Vista, or even more accurately install it on my laptop on Vista.&lt;/p&gt;  &lt;p&gt;A SQL Server will expect to run constantly on the machine that it is installed on. However, not on my laptop. I generally have SQL Server turned off on my laptop because it uses resources that it does not need. I don't frequently use SQL Server on my laptop but I do need it sometimes. Because of this, during the installation I customise it so that the SQL Server services do not start up automatically as they normally would.&lt;/p&gt;  &lt;p&gt;There is a slight problem with this approach I've discovered when installing on Vista. SQL Server 2005 came out before Windows Vista and they don't actually get along out of the box. You have to install SQL Server 2005 SP2 (or so several dialogs claim) before you can start working with SQL Server 2005 on Windows Vista.&lt;/p&gt;  &lt;p&gt;At the end of the process for installing SP2 it will let you know that admin users on the Vista box will not be admin in SQL Server unless you are explicit about which users to add. It then launches a "SQL Server 2005 User Provisioning Tool for Vista" to allow you to set up the admin users. However, if the SQL Server services are not running it cannot do this - the User Provisioning Tool will run, but when you apply the changes it will popup an error message and quit. So, it would seem that what I should have done is let the installer get on with running SQL Server 2005 when it finished so that the admin users could be set up. However, I didn't and it failed. So, without any users set up on the SQL Server I could not log in.&lt;/p&gt;  &lt;p&gt;After hunting around on disk for this User Provisioning Tool I discovered that the SQL Server 2005 Surface Area Configuration tool will allow me to launch the tool by pressing the "Add New Administrator" link in its dialog. So, with the SQL Server services (all of them indicating in the User Provisioning Tool, in my case the Database Engine and the Analysis Services) running I add myself to the list of users, click OK and.... A moment later everything seem to work. There is no confirmation, the dialog just goes away without any error messages. To test it worked I opened up the SQL Server Management Studio and attempt to log in. It works. I'm happy.&lt;/p&gt;  &lt;p&gt;Now, finally, I go and limit the amount of memory I'm prepared to allow SQL Server to use. See my post on managing &lt;a href="http://blog.colinmackay.net/archive/2008/07/20/2996.aspx" target="_blank"&gt;SQL Server's memory usage&lt;/a&gt;. It is a laptop after all...&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a752e2b0-3e97-43f3-9c2d-9bdac36ce5fb" 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/sql%20server" rel="tag"&gt;sql server&lt;/a&gt;,&lt;a href="http://technorati.com/tags/sql%20server%202005" rel="tag"&gt;sql server 2005&lt;/a&gt;,&lt;a href="http://technorati.com/tags/vista" rel="tag"&gt;vista&lt;/a&gt;,&lt;a href="http://technorati.com/tags/user%20provisioning%20tool" rel="tag"&gt;user provisioning tool&lt;/a&gt;,&lt;a href="http://technorati.com/tags/sp2" rel="tag"&gt;sp2&lt;/a&gt;,&lt;a href="http://technorati.com/tags/administrator" rel="tag"&gt;administrator&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/3200.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/08/03/3200.aspx</guid>
            <pubDate>Sun, 03 Aug 2008 10:40:48 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/3200.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/08/03/3200.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/3200.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>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>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>
        <item>
            <title>SQL Bits III - Call for Speakers</title>
            <link>http://blog.colinmackay.net/archive/2008/06/28/2676.aspx</link>
            <description>&lt;p&gt;&lt;a href="http://www.sqlbits.com/"&gt;&lt;img style="margin: 5px" src="http://www.sqlbits.com/images/SQLBItsIIILogo%20Basic%20No%20Logo.png" align="right" /&gt;&lt;/a&gt;&lt;a href="http://www.sqlbits.com/information/SessionSubmission.aspx" target="_blank"&gt;Session submission is now open&lt;/a&gt; for &lt;a href="http://www.sqlbits.com/default.aspx" target="_blank"&gt;SQL Bits III&lt;/a&gt;. SQL Bits III will take place on Saturday 13th September in Hatfield, Hertfordshire. &lt;/p&gt;  &lt;p&gt;Also, if you are feeling particularly artistic they are also running a &lt;a href="http://www.sqlbits.com/LogoCompetition.aspx" target="_blank"&gt;competition to come up with a new logo&lt;/a&gt;.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e6b2dd0d-e5af-42ee-a04b-4b6fffb23b70" 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/SQL%20Server" rel="tag"&gt;SQL Server&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SQLBits" rel="tag"&gt;SQLBits&lt;/a&gt;,&lt;a href="http://technorati.com/tags/conference" rel="tag"&gt;conference&lt;/a&gt;,&lt;a href="http://technorati.com/tags/hatfield" rel="tag"&gt;hatfield&lt;/a&gt;,&lt;a href="http://technorati.com/tags/competition" rel="tag"&gt;competition&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/2676.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/06/28/2676.aspx</guid>
            <pubDate>Sat, 28 Jun 2008 22:45:01 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/2676.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/06/28/2676.aspx#feedback</comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/2676.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Event Organisation - The Feedback</title>
            <link>http://blog.colinmackay.net/archive/2008/06/23/2622.aspx</link>
            <description>&lt;p&gt;This is the first post in a series of random thoughts on community events that I'm writing based on my experience running a user group and the Developer Day Scotland conference.&lt;/p&gt;  &lt;p&gt;In this post I'll concentrate on receiving feedback. &lt;/p&gt;  &lt;div style="float: right; margin: 10px; text-align: center"&gt;&lt;img src="http://farm4.static.flickr.com/3126/2501184571_b8278b166e_m.jpg" /&gt;     &lt;br /&gt;&lt;small&gt;Photo by Craig Murphy&lt;/small&gt;&lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;First, I should like to concentrate on the management of feedback. If the event asks people to fill in feedback then it should be collated and returned to the speaker as soon as possible. For my user group meetings I try and ensure that when I get home afterwards I collate the feedback and email the speaker before I go to bed. The quicker the speaker can receive the feedback the quicker they can see how they did. The closer to the event the more they will remember and the better they will be able to evaluate the feedback effectively. For Developer Day Scotland I got the feedback out to all the speakers within 3 days.&lt;/p&gt;  &lt;p&gt;If the speaker doesn't receive their feedback after a number of weeks they they are most likely to have forgotten specific incidents during their presentation. The guy that writes "Loved the quip about..." or "It was most annoying when you..." has effectively wasted their time if you, as a speaker, can no longer remember making the quip or doing the annoying thing. The quip may have been an off the cuff remark made in the moment that you could have incorporated in to your future presentations - If you can't remember it, then you've lost the opportunity to re-use it and entertain as well as educate. Similarly, if you can't remember the annoying thing then the comment about it won't help you so much. It isn't easy to purge annoying habits if you don't remember doing them or associate a particular habit as being annoying.&lt;/p&gt;  &lt;p&gt;Bottom line on this point is to get the feedback to the speakers promptly. Devote time to collating it and delivering it to speakers. The sooner the better.&lt;/p&gt;  &lt;p&gt;It's all very well and good saying that but how do you turn around the feedback quickly?&lt;/p&gt;  &lt;p&gt;If you have a paper based feedback system in place where you are collecting feedback after each session, you can have people help you input that into excel or a database. That will help you get the feedback processed quicker. In this case many hands make light work.&lt;/p&gt;  &lt;p&gt;From personal experience, I don't recommend the online feedback that happens after the event. This style of feedback takes longer because you are waiting on the attendees actually fill it in. Some might do it promptly, others might take their time, and some will just plain forget. From an organiser's perspective, the online feedback may seem to be an easy win; it is much easier to collate as it is done online so the database is being populated by the actual attendees. Of course, as the feedback is filled in after the event the attendees recollection starts to fade.&lt;/p&gt;  &lt;p&gt;If you want to get as many people to fill in the feedback as possible I've found that basing prize draws on the feedback forms submitted encourages more people to fill in feedback. For events such as Developer Day Scotland we had some prominent sponsors offer us developer tools as giveaway item. But smaller items such as books, T-shirts, mice can do just as well for user group meetings.&lt;/p&gt;  &lt;p&gt;Having been responsible for collating feedback for a variety of speakers I've seen a fair amount of variety in the comments. However, I have to admit that I've never had a stunningly bad speaker at any of my events yet. For the most part feedback is positive. The audience generally really does want the speaker to succeed and will often give some leeway for things that go wrong that is out of the control of the speaker. &lt;/p&gt;  &lt;p&gt;I've also found that there are a few really angry people out there who only ever give bad feedback. So, if you are a first time speaker and you've got one of those nutters at your session try not to take it too personally. I'm not going to go on at length about how to interpret feedback as &lt;a href="http://idunno.org/Default.aspx" target="_blank"&gt;Barry Dorrans&lt;/a&gt;, an experienced speaker at DDD and other events, has an excellent post on the subject on his blog: &lt;a href="http://idunno.org/archive/2008/06/05/is-quotbadquot-feedback-the-best-feedback.aspx" target="_blank"&gt;Is "bad" feedback the best feedback?&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Finally, there is feedback form itself. What do you ask people? How do you want the results. There are two main types of answer, in my opinion. The first is the tick-the-box style where you just tick the box for the score out of 5 (or 10) on a particular aspect. The second is a question that requires a text based answer, a few words or a couple of sentences.&lt;/p&gt;  &lt;p&gt;For the event organiser the questions that ask people to tick a box are often better because it means that when you collate all the feedback together you can rank the speakers. I did this for &lt;a href="http://developerdayscotland.com/main" target="_blank"&gt;Developer Day Scotland&lt;/a&gt; (and published some of &lt;a href="http://blog.colinmackay.net/archive/2008/05/12/2341.aspx" target="_blank"&gt;the results&lt;/a&gt;.) You can set a base line where you say, if anyone drops below this line they don't get invited back, or if anyone goes above that line they are automatically accepted next time. Or, if you are like &lt;a href="http://www.nxtgenug.net/" target="_blank"&gt;NxtGenUG&lt;/a&gt; you can use these scores to give out prizes to the best speakers.&lt;/p&gt;  &lt;p&gt;From the speaker's perspective the text based answers are often better because they give a greater variety of feedback and allow the evaluator to express themselves. This can be used to tell the speaker what they did well, to show appreciation, to point out a negative aspect, or to suggest a way to improve. The wide variations in what people can put would rule out giving them tick-boxes to mark off.&lt;/p&gt;  &lt;p&gt;For the text based answers the questions have to be open. They have to encourage people to say what ever they want to say without constraining them into thinking that something isn't important because it wasn't asked for directly. I often reduce it to just two questions. "What did you like?" and "What didn't you like?" And other times I'll also include the catch all "Are there any other comments you'd like to make?"&lt;/p&gt;  &lt;p&gt;Hopefully you've found this useful for your own events, or perhaps you have your own comments you'd like to add. Either way I'd welcome any feedback so feel free to leave a comment.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:3c18a138-0ff6-40f1-986e-4bb1ceb50969" 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/ddd%20scotland" rel="tag"&gt;ddd scotland&lt;/a&gt;,&lt;a href="http://technorati.com/tags/developer%20day%20scotland" rel="tag"&gt;developer day scotland&lt;/a&gt;,&lt;a href="http://technorati.com/tags/feedback" rel="tag"&gt;feedback&lt;/a&gt;,&lt;a href="http://technorati.com/tags/evaluation" rel="tag"&gt;evaluation&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.colinmackay.net/aggbug/2622.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/06/23/2622.aspx</guid>
            <pubDate>Mon, 23 Jun 2008 00:42:45 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/2622.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/06/23/2622.aspx#feedback</comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/2622.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Scottish Developers Newsletter - June 2008</title>
            <link>http://blog.colinmackay.net/archive/2008/06/22/2620.aspx</link>
            <description>&lt;style type="text/css"&gt;&lt;![CDATA[

h1 {
	font-family: verdana, arial, helvetica, sans-serif;
	font-size: x-large;
	font-weight: bold;
	border-top-style: double;
	border-top-width: medium;
	border-top-color: #ffcc99;
}
p {
	font-family: verdana, arial, helvetica, sans-serif;
	font-size: small;
	font-weight: normal;
}
p.eventheader {
	font-weight: bold;
}
p.eventdetail {
	border-bottom-style: dotted;
	border-bottom-width: thin;
	border-bottom-color: #ffcc99;
}
p.smallprint {
	font-size: xx-small;
}]]&gt;&lt;/style&gt;  &lt;h1&gt;Welcome&lt;/h1&gt;  &lt;p&gt;As the &lt;a href="http://blog.colinmackay.net/archive/2008/06/01/2453.aspx" target="_blank"&gt;last newsletter&lt;/a&gt; came out a little late the time to this newsletter seems quite short. However, that doesn't mean there isn't lots of good stuff happening. We are filling out our programme of events until the end of the year and have some quite exciting things lined up. Some things are still in the planning stage so there isn't much to tell and its subject to change, other things are a little more advanced. You can see what's on the horizon in the "Further Afield" section below.&lt;/p&gt;  &lt;p&gt;One of our members (Paul Cowan) has a job opening at the moment. If you are a C#/ASP.NET developer looking for a job in Glasgow then he would be interested in your CV. For &lt;a href="http://www.scottishdevelopers.com/modules/newbb/viewtopic.php?viewmode=flat&amp;amp;topic_id=1163&amp;amp;forum=8100"&gt;full details see the website&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;If you are a "Girl Geek" and would like a chance of winning a one year MSDN Premium Subscription then head over to the "&lt;a href="http://girlygeekdom.blogspot.com"&gt;Girly Geekdom Blog&lt;/a&gt;" and &lt;a href="http://girlygeekdom.blogspot.com/2008/06/submit-ddd-session-win-msdn-premium.html"&gt;enter the competition&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Glasgow Caledonian University are in the planning stages of a Postgraduate course on .NET Application Development. If this is something you think you might be interested in, or if you know someone that might be interested in it then they are running a survey to find out what people would want from such a course. The &lt;a href="http://www.surveymonkey.com/s.aspx?sm=Rj_2bK9gZDT1zczxje_2bIO5hA_3d_3d"&gt;survey can be found here&lt;/a&gt;.&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;.  &lt;/p&gt;  &lt;p&gt;Regards,   &lt;br /&gt;Colin Mackay on Behalf of Scottish Developers&lt;/p&gt;  &lt;h1&gt;Events&lt;/h1&gt;  &lt;p class="EventHeader"&gt;&lt;strong&gt;8-July-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=68"&gt;&lt;strong&gt;Functional Programming in C# 3.0&lt;/strong&gt;&lt;/a&gt;    &lt;br /&gt;FREE - Registration optional&lt;/p&gt;  &lt;p class="EventDetail"&gt;The newest version of C# introduces a number of language features that finally make it very easy to employ a functional style of programming. However, from the perspective of an imperative programmer, there are lots of questions surrounding functional programming. Why would I want to do it at all? Should I drop all state information in my apps? What useful functional patters are applicable to C#? In this session Oliver Sturm uses many practical examples (and some theory) to try and answer these questions. &lt;/p&gt;  &lt;p class="EventHeader"&gt;&lt;strong&gt;16-July-2008 @ 18:00 in Livingston (VBUG)&lt;/strong&gt;    &lt;br /&gt;&lt;a href="http://www.vbug.com/Events/July-2008/VBUG-SCOTLAND-F-with-Oliver-Sturm.aspx"&gt;&lt;strong&gt;F# with Oliver Sturm&lt;/strong&gt;&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;a href="http://www.scottishdevelopers.com/modules/extcal/event.php?event=69"&gt;Paul Cowan talks about using ALT.NET technology&lt;/a&gt; (Glasgow)&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;Useful Links&lt;/h1&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.mozilla-europe.org/en/firefox/"&gt;Firefox 3&lt;/a&gt;&lt;/strong&gt;: The browser that has it all (apparently). And &lt;a href="http://www.arcanology.com/2008/06/17/ie-sends-mozilla-a-new-cake-for-firefox-3/"&gt;Microsoft's IE team sent a congratulatory cake&lt;/a&gt; to help the Mozilla guys to help them celebrate.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href="http://jquery.com/blog/2008/06/09/jquery-ui-v15-released-focus-on-consistent-api-and-effects/"&gt;jQuery UI 1.5&lt;/a&gt;&lt;/strong&gt;: One API to rule them all! jQuery is a JavaScript library that simplifies how you traverse HTML documents, handle events, perform animations, etc.&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;br /&gt;&lt;/p&gt;  &lt;p class="SmallPrint"&gt;SMALL PRINT: You are receiving this message because you signed up to receive information from Scottish Developers at an event. If you no longer wish to receive information from us please reply to this email (&lt;a href="mailto:colin@scottishdevelopers.com"&gt;colin@scottishdevelopers.com&lt;/a&gt;) and ask to be removed from the list.&lt;/p&gt;&lt;img src="http://blog.colinmackay.net/aggbug/2620.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Colin Angus Mackay</dc:creator>
            <guid>http://blog.colinmackay.net/archive/2008/06/22/2620.aspx</guid>
            <pubDate>Sun, 22 Jun 2008 23:37:50 GMT</pubDate>
            <wfw:comment>http://blog.colinmackay.net/comments/2620.aspx</wfw:comment>
            <comments>http://blog.colinmackay.net/archive/2008/06/22/2620.aspx#feedback</comments>
            <wfw:commentRss>http://blog.colinmackay.net/comments/commentRss/2620.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>