<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Peter Ritchie's MVP Blog : .NET Development</title><link>http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx</link><description>Tags: .NET Development</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Evolving code over time</title><link>http://msmvps.com/blogs/peterritchie/archive/2009/03/30/evolving-code-over-time.aspx</link><pubDate>Tue, 31 Mar 2009 04:02:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1682545</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1682545</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2009/03/30/evolving-code-over-time.aspx#comments</comments><description>&lt;p&gt;Given economics, time constraints, resource limitations, etc.; you can&amp;#39;t write all the functionality for a given solution for a single release.&amp;nbsp; Even if you weren&amp;#39;t limited by these constraints, you&amp;#39;re likely to get changing requirements as development progresses and everyone learns more about the software under development. &lt;/p&gt;
&lt;p&gt;It&amp;#39;s fairly easy to prioritize what is developed and what isn&amp;#39;t.&amp;nbsp; You simply develop only what you need (see YAGNI).&amp;nbsp; But, how do you manage adding new functionality without causing undue grief?&amp;nbsp; One way is to only make additive changes to the code.&amp;nbsp; For example, let&amp;#39;s say we have the method create CreateRequestPacket that creates a blob of bytes to send to a host over the wire: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;public static byte[] CreateRequestPacket() &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] result = new byte[12]; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; result[0] = REQUEST_CODE; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; result[1] = NO_OPTIONAL_DATA_FLAG; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; result[2] = (byte) (result.Length - 2); &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Random random = new Random(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 3; i &amp;lt; result.Length; ++i) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = (byte) (random.Next() % byte.MaxValue); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result; &lt;br /&gt;}&lt;/span&gt; &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In iteration x it writes out a request making certain assumptions about what the request contains.&amp;nbsp; But, in iteration y it needs to optionally include other data.&amp;nbsp; A non additive way is to simply modify CreateRequestPacket to do what is needed: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;public static byte[] CreateRequestPacket(bool useOptionalData) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] result = new byte[12]; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; result[0] = REQUEST_CODE; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; result[1] = OPTIONAL_DATA_FLAG; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int index = 2; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(useOptionalData) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result[index] = GetOptionalData(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ++index; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; result[index] = (byte) (result.Length - index); &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Random random = new Random(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = index + 1; i &amp;lt; result.Length; ++i) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = (byte) (random.Next() % byte.MaxValue); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result; &lt;br /&gt;}&lt;/span&gt; &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now all calls to CreateRequestPacket need to change before a build can occure and you might not be able to modify all the files that contain these calls.&amp;nbsp; So it causes undue blocking and forces you to change a number of files before you can check the file that CreateRequestPacket is contained withing. &lt;/p&gt;
&lt;p&gt;Another way of implementing this would be to implement an additive change.&amp;nbsp; That is, add a method that does what is needed and change the previous implementation to call the new method.&amp;nbsp; For example: &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;public static byte[] CreateRequestPacket(bool useOptionalData) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; byte[] result = new byte[12]; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; result[0] = REQUEST_CODE; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; result[1] = OPTIONAL_DATA_FLAG; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int index = 2; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(useOptionalData) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result[index] = GetOptionalData(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ++index; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; result[index] = (byte) (result.Length - index); &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Random random = new Random(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = index + 1; i &amp;lt; result.Length; ++i) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = (byte) (random.Next() % byte.MaxValue); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return result; &lt;br /&gt;} &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family:Courier New;"&gt;public static byte[] CreateRequestPacket() &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return CreateRequestPacket(false); &lt;br /&gt;}&lt;/span&gt; &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This allows you to check the file that contains CreateRequestPacket in right after passing unit testing and allows you to gradually change all calls to CreateRequestPacket as time permits.&lt;/p&gt;
&lt;div style="text-align:right;margin:0px;padding:4px 0px 4px 0px;" class="wlWriterHeaderFooter"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fmsmvps.com%2fblogs%2fpeterritchie%2farchive%2f2009%2f03%2f28%2fevolving-code-over-time.aspx&amp;amp;title=Evolving+code+over+time."&gt;&lt;img border="0" width="100" src="http://digg.com/img/badges/100x20-digg-button.png" alt="Digg This" height="20" style="border:0;" title="Digg This" /&gt;&lt;/a&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://msmvps.com/blogs/peterritchie/archive/2009/03/28/evolving-code-over-time.aspx"&gt;&lt;img border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://msmvps.com/blogs/peterritchie/archive/2009/03/28/evolving-code-over-time.aspx&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKick This" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1682545" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development/default.aspx">Software Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Design_2F00_Coding+Guidance/default.aspx">Design/Coding Guidance</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development+Practices/default.aspx">Software Development Practices</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development+Guidance/default.aspx">Software Development Guidance</category></item><item><title>DevTeach 2009 Vancouver</title><link>http://msmvps.com/blogs/peterritchie/archive/2009/03/26/devteach-2009-vancouver.aspx</link><pubDate>Thu, 26 Mar 2009 16:33:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1681658</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1681658</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2009/03/26/devteach-2009-vancouver.aspx#comments</comments><description>&lt;p&gt;The schedule for DevTeach 2009 Vancouver has been announced (&lt;a href="http://www.devteach.com/" title="http://www.devteach.com/"&gt;http://www.devteach.com/&lt;/a&gt;).&amp;nbsp; There&amp;rsquo;s lots of great software development sessions from some of the leaders in our industry.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re planning on improving yourself, this is the conference to go to.&amp;nbsp; Not only can you attend excellent sessions; but you can hob-knob with the presenters and pick their brains.&lt;/p&gt;
&lt;p&gt;If you have a friend or co-worker who&amp;rsquo;s interested, there&amp;rsquo;s a limited-time two-for-one offer for an even better price: &lt;a href="http://www.devteach.com/Register.aspx" title="http://www.devteach.com/Register.aspx"&gt;http://www.devteach.com/Register.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fmsmvps.com%2fblogs%2fpeterritchie%2farchive%2f2009%2f03%2f26%2fdevteach-2009-vancouver.aspx"&gt;&lt;img border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmsmvps.com%2fblogs%2fpeterritchie%2farchive%2f2009%2f03%2f26%2fdevteach-2009-vancouver.aspx" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1681658" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development/default.aspx">Software Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Visual+Studio+2005/default.aspx">Visual Studio 2005</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+2.0/default.aspx">.NET 2.0</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Design_2F00_Coding+Guidance/default.aspx">Design/Coding Guidance</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+3.x/default.aspx">.NET 3.x</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_+3.0/default.aspx">C# 3.0</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/DevTeach/default.aspx">DevTeach</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/DDD/default.aspx">DDD</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development+Practices/default.aspx">Software Development Practices</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development+Guidance/default.aspx">Software Development Guidance</category></item><item><title>A Upcoming Pandemic of Domain Anaemia</title><link>http://msmvps.com/blogs/peterritchie/archive/2009/01/29/a-upcoming-pandemic-of-domain-anaemia.aspx</link><pubDate>Thu, 29 Jan 2009 17:10:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1666992</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1666992</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2009/01/29/a-upcoming-pandemic-of-domain-anaemia.aspx#comments</comments><description>&lt;p&gt;There&amp;#39;s a well-known anti-pattern called the anaemic domain model[1][2].&amp;nbsp; This anti-pattern basically says domain entities, chronically, have little or no behaviour (remember, object-oriented design is about attributes &lt;strong&gt;and&lt;/strong&gt; behaviour).&lt;/p&gt;
&lt;p&gt;It should be obvious that a domain model that isn&amp;#39;t truly object oriented is a domain model with a problem.&amp;nbsp; But, let&amp;#39;s look at other reasons why the Anaemic Domain Model is an anti-pattern.&amp;nbsp; Your Domain is the nexus, the essence, of your system.&lt;/p&gt;
&lt;p&gt;An anaemic domain model is basically a reporting system.&amp;nbsp; Each &amp;quot;Entity&amp;quot; becomes, essentially, a query.&amp;nbsp; This is fine, reporting systems are necessary and prevalent.&amp;nbsp; But, to shoe-horn a domain model on top of this leads away from good reporting patterns that could add value and increases complexity, needlessly.&amp;nbsp; The designers spend most of their time trying to force entities on the system, without recognizing the basic reporting nature of the system.&amp;nbsp; This usually leads to &amp;quot;reports&amp;quot; that have to pull in multiple domain &amp;quot;entities&amp;quot; to generate the report--rehydringing data into an entity (usually through some sort of ORM) with no value added.&amp;nbsp; i.e. an ORM that will manage the child-parent relationship (and either pre-load or lazy-load aggregates) doesn&amp;#39;t provide much value here.&lt;/p&gt;
&lt;p&gt;The worst case scenario with an anaemic domain model is that there really is behaviour there; but it&amp;#39;s not handled in the domain entities; it&amp;#39;s handled in a different layer.&amp;nbsp; This is a problem because this circumvents the whole point of a domain model and layering.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;One indication of anaemia is that most of the domain classes&amp;nbsp; simply contain attributes.&amp;nbsp; Anyone familiar with patterns should recognize this as a Data Transfer Object, not a Domain Entity.&amp;nbsp; There&amp;#39;s nothing wrong with DTOs, they&amp;#39;re very important in almost all systems with any sort of complexity; but they&amp;#39;re not Domain Entities.&amp;nbsp; Let&amp;#39;s be truthful, there are systems with little or no behaviour in the domain; and that&amp;#39;s not a bad thing.&amp;nbsp; Systems like this likely don&amp;#39;t need a Domain Model and may not need techniques like Domain Driven Design.&amp;nbsp; The quicker people recognize that, the quicker they can be using a more appropriate architecture and design.&amp;nbsp; In some extreme cases the anaemic-domain-entity-DTOs service other DTOs&lt;/p&gt;
&lt;p&gt;Now, where am I going with this?&amp;nbsp; Well, there&amp;#39;s been a series of guidance out of Microsoft Patterns and Practice about some application &amp;quot;patterns&amp;quot;.&lt;/p&gt;
&lt;p&gt;First, let me describe what a pattern is.&amp;nbsp; A pattern is a way of &amp;quot;documenting a solution to a design problem&amp;quot; [3].&amp;nbsp; First, for it to be a pattern, it needs to detail the problem and it&amp;#39;s context, then provide a solution.&amp;nbsp; The latest &amp;quot;patterns&amp;quot; from P&amp;amp;P do not detail the problem or a context.&amp;nbsp; They&amp;#39;re simply architectural descriptions.&lt;/p&gt;
&lt;p&gt;Now the association between the Anaemic Domain Model and the latest P&amp;amp;P guidance.&amp;nbsp; In 3 of the 5 recently publish &amp;quot;patterns&amp;quot; the following is detail is included: &amp;quot;A Domain Entity pattern is used to define business entities that contain data only.&amp;quot;&amp;nbsp; This is the very definition of an Anaemic Domain Model.&amp;nbsp; Plus, in the RIA pattern the following, contradictory, detail is included: &amp;quot;Domain entities are responsible for implementing business rules.&amp;nbsp; Entities from the domain model represent business objects that contain data and implement behavior [sic]. In other words, the business objects are responsible for implementing business operations and interacting with other business objects.&amp;quot;&lt;/p&gt;
&lt;p&gt;This is disconcerting because historically sample code and guidance from Microsoft is simply reused without thought.&amp;nbsp; This leads to poorly designed and architected applications, and the .NET community as a whole is seen as one that produces poor-quality code and design.&amp;nbsp; Without context about the problems these patterns try to solve, they will be misused&amp;mdash;likely forced upon contexts and situations where they don&amp;rsquo;t fit, simply because &amp;ldquo;they&amp;rsquo;re from Microsoft&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;[1] &lt;a href="http://www.martinfowler.com/bliki/AnemicDomainModel.html" title="MF Bliki- AnemicDomainModel"&gt;MF Bliki- AnemicDomainModel&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[2] &lt;a href="http://en.wikipedia.org/wiki/Anemic_Domain_Model" title="Anemic Domain Model - Wikipedia, the free encyclopedia"&gt;Anemic Domain Model - Wikipedia, the free encyclopedia&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[3] &lt;a href="http://en.wikipedia.org/wiki/Design_pattern_(computer_science)" title="Design pattern (computer science) - Wikipedia, the free encyclopedia"&gt;Design pattern (computer science) - Wikipedia, the free encyclopedia&lt;/a&gt;&lt;/p&gt;
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:18e4120a-82b3-45b3-8d5c-9449fa380fad" class="wlWriterSmartContent"&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/Microsoft+Patterns+and+Practicies"&gt;Microsoft Patterns and Practicies&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Anti-patterns"&gt;Anti-patterns&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Anaemic"&gt;Anaemic&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Anemic"&gt;Anemic&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Domain+Model"&gt;Domain Model&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Microsoft"&gt;Microsoft&lt;/a&gt;&lt;/div&gt;
&lt;div style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:bf1c39d4-6db7-4130-b9ff-995a8a4cb99f" class="wlWriterSmartContent"&gt;del.icio.us Tags: &lt;a rel="tag" href="http://del.icio.us/popular/Microsoft+Patterns+and+Practicies"&gt;Microsoft Patterns and Practicies&lt;/a&gt;,&lt;a rel="tag" href="http://del.icio.us/popular/Anti-patterns"&gt;Anti-patterns&lt;/a&gt;,&lt;a rel="tag" href="http://del.icio.us/popular/Anaemic"&gt;Anaemic&lt;/a&gt;,&lt;a rel="tag" href="http://del.icio.us/popular/Anemic"&gt;Anemic&lt;/a&gt;,&lt;a rel="tag" href="http://del.icio.us/popular/Domain+Model"&gt;Domain Model&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align:right;margin:0px;padding:4px 0px 4px 0px;" class="wlWriterHeaderFooter"&gt;&lt;a href="http://digg.com/submit?url=http%3a%2f%2fmsmvps.com%2fblogs%2fpeterritchie%2farchive%2f2009%2f01%2f29%2fa-upcoming-pandemic-of-domain-anaemia.aspx&amp;amp;title=A+Upcoming+Pandemic+of+Domain+Anaemia"&gt;&lt;img border="0" width="100" src="http://digg.com/img/badges/100x20-digg-button.png" alt="Digg This" height="20" style="border:0;" title="Digg This" /&gt;&lt;/a&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://msmvps.com/blogs/peterritchie/archive/2009/01/29/a-upcoming-pandemic-of-domain-anaemia.aspx"&gt;&lt;img border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://msmvps.com/blogs/peterritchie/archive/2009/01/29/a-upcoming-pandemic-of-domain-anaemia.aspx&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKick This" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1666992" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development/default.aspx">Software Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Design_2F00_Coding+Guidance/default.aspx">Design/Coding Guidance</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Patterns/default.aspx">Patterns</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/OOD/default.aspx">OOD</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/AntiPattern/default.aspx">AntiPattern</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/DDD/default.aspx">DDD</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/ALT.NET/default.aspx">ALT.NET</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development+Practices/default.aspx">Software Development Practices</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development+Guidance/default.aspx">Software Development Guidance</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Microsoft+Patterns+and+Practices/default.aspx">Microsoft Patterns and Practices</category></item><item><title>Unable To Step Into .NET Source</title><link>http://msmvps.com/blogs/peterritchie/archive/2008/11/24/unable-to-step-into-net-source.aspx</link><pubDate>Mon, 24 Nov 2008 20:59:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1653924</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1653924</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2008/11/24/unable-to-step-into-net-source.aspx#comments</comments><description>&lt;p&gt;I began getting a problem a while ago that I was unable to step into the .NET source in Visual Studio 2008.&amp;nbsp; It happened suddenly, and I noticed it shortly after installing SP1.&amp;nbsp; Given my observation it appears to be due to upgrading the SP1; but I couldn&amp;rsquo;t find anyone else not having the same problem.&amp;nbsp; I had another computer where it worked, so I basically put it aside.&lt;/p&gt;
&lt;p&gt;Today I had a chance to have a closer look.&amp;nbsp; I had configured 2008 (RTM, not SP1) to get the .NET source based on Shawn Burke&amp;rsquo;s blog and had not encountered any problems.&amp;nbsp; Once I upgraded to SP1 and checked &amp;ldquo;enabled .Net source stepping&amp;rdquo;, I all I ever got when trying to step through source is a dialog asking me for the location of the CS file.&lt;/p&gt;
&lt;p&gt;What I had configured was to place the debug symbols into a folder in the Visual Studio 2008 user directory (c:\Documents and Settings\PRitchie\My Documents\Visual Studio 2008\Symbols, for example).&lt;/p&gt;
&lt;p&gt;Despite creating a new subdirectory for SP1, I still could not step through the source.&lt;/p&gt;
&lt;p&gt;It wasn&amp;rsquo;t until I moved the directory down the hierarchy that I finally got some joy.&amp;nbsp; I first tried it on the root and it worked fine.&amp;nbsp; I then tried it as a sub directory within my documents and it worked fine.&amp;nbsp; I imagine that the path was longer that 260 and rather than present the user with an error with that detail it assumed it couldn&amp;rsquo;t find the file it was looking for and asked the user for the location of it.&amp;nbsp; But, I&amp;rsquo;m guessing.&lt;/p&gt;
&lt;p&gt;Hope this helps someone else.&lt;/p&gt;
&lt;div style="text-align:left;margin:0px;padding:4px 4px 4px 4px;" class="wlWriterHeaderFooter"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://msmvps.com/blogs/peterritchie/archive/2008/11/12/unable-to-step-into-net-source.aspx&amp;amp;title=Unable%20To%20Step%20Into%20.NET%20Source"&gt;&lt;img border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://msmvps.com/blogs/peterritchie/archive/2008/11/12/unable-to-step-into-net-source.aspx&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1653924" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Visual+Studio+2008+SP1/default.aspx">Visual Studio 2008 SP1</category></item><item><title>Pass-through Constructors</title><link>http://msmvps.com/blogs/peterritchie/archive/2008/11/21/pass-through-constructors.aspx</link><pubDate>Fri, 21 Nov 2008 18:09:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1654471</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1654471</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2008/11/21/pass-through-constructors.aspx#comments</comments><description>&lt;p&gt;Pass-through constructors is a term I use to describe parameterized constructors that have none of their own logic and simply pass parameters to the base class.&amp;nbsp; For example: &lt;/p&gt;
&lt;div style="font-size:10pt;background:white;color:black;font-family:courier new;"&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;BaseClass&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt; text;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; BaseClass(&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt; text)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.text = text;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DerivedClass&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;BaseClass&lt;/span&gt;&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; DerivedClass(&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt; text)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : &lt;span style="color:#0000ff;"&gt;base&lt;/span&gt;(text)&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;
&lt;/div&gt;
&lt;div style="text-align:left;margin:0px;padding:4px 4px 4px 4px;" class="wlWriterHeaderFooter"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://msmvps.com/blogs/peterritchie/archive/2008/11/18/pass-through-constructors.aspx&amp;amp;title=Pass-through%20Constructors"&gt;&lt;img border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://msmvps.com/blogs/peterritchie/archive/2008/11/18/pass-through-constructors.aspx&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1654471" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development/default.aspx">Software Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Definition/default.aspx">Definition</category></item><item><title>DevTeach 2008 Includes over $1,000 In Free Software.</title><link>http://msmvps.com/blogs/peterritchie/archive/2008/11/13/devteach-2008-includes-over-1-000-in-free-software.aspx</link><pubDate>Thu, 13 Nov 2008 08:52:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1653989</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1653989</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2008/11/13/devteach-2008-includes-over-1-000-in-free-software.aspx#comments</comments><description>&lt;p&gt;Announced recently, registering for and attending DevTeach Montreal 2008 will land you with $1,000 of free software.&amp;nbsp; Including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Visual Studio 2008 Pro&lt;/li&gt;
&lt;li&gt;Expression Web 2&lt;/li&gt;
&lt;li&gt;TechEd Conference DVD set&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The sessions have shaped up to be some of the best training money can buy, now you get a bunch of free software to boot.&lt;/p&gt;
&lt;p&gt;For more details on the free software see: &lt;a href="http://www.devteach.com/News.aspx"&gt;http://www.devteach.com/News.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;For a look at the sessions see: &lt;a href="http://www.devteach.com/Schedule.aspx"&gt;http://www.devteach.com/Schedule.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To register go to: &lt;a href="http://www.devteach.com/Register.aspx"&gt;http://www.devteach.com/Register.aspx&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1653989" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/DevTeach+YUL+2008/default.aspx">DevTeach YUL 2008</category></item><item><title>.NET 4.0, Evolving .NET Development</title><link>http://msmvps.com/blogs/peterritchie/archive/2008/11/12/net-4-0-evolving-net-development.aspx</link><pubDate>Wed, 12 Nov 2008 16:02:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1653897</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1653897</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2008/11/12/net-4-0-evolving-net-development.aspx#comments</comments><description>&lt;p&gt;.NET 4.0 is the first release of .NET since 2.0 that evolves .NET for every programmer.&amp;nbsp; .NET 3.0 was largely LINQ and .NET 3.5 was largely new namespaces (like WCF, WWF, etc.) &lt;/p&gt;
&lt;p&gt;.NET 4.0 evolves the programming and design for any programmer.&amp;nbsp; It offers framework support for parallel processing (PFX will be released), Code Contracts (now DbC is a reality at the framework level, and opens the possibility of it being a reality at the language level post 2010), variance changes (co- and contra-variance on generics interfaces and delegates is now a reality). &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parallel Processing &lt;br /&gt;&lt;/strong&gt;Moore&amp;#39;s law has changed from single processors doubling in speed every 18 months to doubling in processing power through increased core count every 18 months.&amp;nbsp; This means for applications to make use of processing power increases they must increasingly make use of parallel processing and multi-threading.&amp;nbsp; The PFX makes this more a reality by providing a framework by which application designers can more easily write code to support multi-core processors and multi-processor computers. &lt;/p&gt;
&lt;p&gt;With PFX writing a loop to make use of multiple processors (while still supporting single processors) will be as easy as: &lt;/p&gt;
&lt;div style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:Courier New;"&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;uint&lt;/span&gt;[] numbers = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;uint&lt;/span&gt;[] {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Parallel&lt;/span&gt;.ForEach(numbers, &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;uint&lt;/span&gt; number) { &lt;span style="color:#2b91af;"&gt;Trace&lt;/span&gt;.WriteLine(CalculateFibonacci(number)); });&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Code Contracts&lt;/strong&gt; &lt;br /&gt;Design by contract is a form of writing software with verifiable interface specifications.&amp;nbsp; These specifications can be used at compile time to find code that breaks the contract and not require checking of the contract at run-time.&amp;nbsp; For example: &lt;/p&gt;
&lt;div style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:Courier New;"&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color:#2b91af;"&gt;ContractInvariantMethod&lt;/span&gt;]&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Calculate()&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; result = 0;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; value &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; values)&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.operation(&lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; result, value);&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; result;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;If anything modifies the current class within the Calculate method, an exception will be thrown at run-time.&amp;nbsp; Compilers will eventually be able to perform rudimentary checks at compile-time to ensure these contracts are abided by.&amp;nbsp; For example:&lt;/p&gt;
&lt;div style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:Courier New;"&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color:#2b91af;"&gt;ContractInvariantMethod&lt;/span&gt;]&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Calculate()&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; result = 0;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; value &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; values)&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.operation(&lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; result, value);&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.date = &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;.Now;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; result;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;...may eventually cause a compile error on the assignment to this.date.&amp;nbsp; The person designing this type intended this method to be invariant, meaning it doesn&amp;#39;t change the state of the object to which it belongs.&amp;nbsp; This design attribute can now be guaranteed. &lt;/p&gt;
&lt;p&gt;Being able to include more design aspects in code and code definitions is a great step forward in not only writing intention-revealing code but in the ability to write more reliable code. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Variance changes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;C# has always had intuitive variance when it came to arrays.&amp;nbsp; For example, the following is valid code:&lt;/p&gt;
&lt;div style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:Courier New;"&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Shape&lt;/span&gt;[] shapes = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Triangle&lt;/span&gt;[10];&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Given:&lt;/p&gt;
&lt;div style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:Courier New;"&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Shape&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;//...&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Triangle&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;Shape&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;//...&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;Generics variance was a different storey.  Prior to Visual C# 2010, this following is a compile error:&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&lt;div style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:Courier New;"&gt;&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Triangle&lt;/span&gt;&amp;gt; triangle = () =&amp;gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Triangle&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Shape&lt;/span&gt;&amp;gt; shape = triangle;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;...despite Triangle being a type of shape (or otherwise known as &amp;quot;bigger&amp;quot; than Shape).  This is known as invariant. In Visual C# 2010 you can now create delegates (as well as types and methods) that are no longer invariant.  For example, a Func delegate could be created that is covariant:&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&lt;div style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:Courier New;"&gt;&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt; T &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; T&amp;gt;();&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;(not the new use of the out keword) ...which could make our previous code:&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Triangle&lt;/span&gt;&amp;gt; triangle = () =&amp;gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Triangle&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Shape&lt;/span&gt;&amp;gt; shape = triangle;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;...compiler without error.&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;The same can be done for contravariance with the the new use of the in keyword:&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt; T &lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; T&amp;gt;(T value);&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;For more details on generics variance, please see Eric Lippert&amp;#39;s series on generics variance: &lt;a href="http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx"&gt;http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx&lt;/a&gt;&lt;/pre&gt;
&lt;/pre&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Other&lt;/strong&gt; &lt;br /&gt;Another notable improvement is side-by-side (SxS) support for multiple versions of .NET.&amp;nbsp; This allows hosting of more than one version of the CLR within a single process.&amp;nbsp; This makes writing shell extensions, for example, in C# a reality in .NET 4.0.&amp;nbsp; You shouldn&amp;#39;t need to target .NET 4.0, but as long as .NET 4.0 is installed you should be able to write shell extensions in a current version of .NET (like .NET 2.0) and it will be supported.&amp;nbsp; Prior to .NET 4.0, a process could only have one version of the CLR loaded into a process, making extending 3rd party native applications (like the Windows shell) very problematic because what version of the CLR that was loaded into a process would depend on the first extension loaded.&amp;nbsp; If the first extension loaded was a .NET 1.1 assembly then any other extensions loaded requiring .NET 2.0 would subsequently&amp;nbsp;fail.&lt;/p&gt;
&lt;div style="text-align:left;margin:0px;padding:4px 4px 4px 4px;" class="wlWriterHeaderFooter"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://msmvps.com/blogs/peterritchie/archive/2008/11/12/net-4-0-evolving-net-development.aspx&amp;amp;title=.NET%204.0,%20Evolving%20.NET%20Development"&gt;&lt;img border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://msmvps.com/blogs/peterritchie/archive/2008/11/12/net-4-0-evolving-net-development.aspx&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1653897" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+4.0/default.aspx">.NET 4.0</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_+4.0/default.aspx">C# 4.0</category></item><item><title>Becoming a Visual Studio Jedi Part 1</title><link>http://msmvps.com/blogs/peterritchie/archive/2008/09/02/becoming-a-visual-studio-jedi.aspx</link><pubDate>Tue, 02 Sep 2008 18:49:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1640948</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1640948</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2008/09/02/becoming-a-visual-studio-jedi.aspx#comments</comments><description>&lt;p&gt;&lt;span style="font-size:large;"&gt;Becoming a Visual Studio 2008 (and often Visual Studio 2005) Jedi&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In much the same grain as James&amp;#39; &lt;a href="http://www.jameskovacs.com/blog/BecomingAJediPart1OfN.aspx"&gt;Resharper Jedi&lt;/a&gt; posts, I&amp;#39;m beginning a series of posts on becoming a Visual Studio Jedi.&amp;nbsp; It involves getting the most out of Visual Studio off-the-shelf, doing things as quickly as possible and with as little friction as possible.&amp;nbsp; I think it&amp;#39;s useful for all users; but especially useful for those who are in situations where they can&amp;#39;t install refactoring tools like Refactor Pro! or Resharper.&lt;/p&gt;
&lt;p&gt;First, familiarize yourself with &lt;a href="http://blogs.msdn.com/saraford/archive/tags/Visual+Studio+2008+Tip+of+the+Day/default.aspx"&gt;Sara&amp;#39;s Visual Studio Tips&lt;/a&gt; blog; then subscribe to her blog.&lt;/p&gt;
&lt;p&gt;I&amp;#39;ll attempt to provide detail at a less granular level than Sara&amp;#39;s blog (i.e. using a series of commands to perform a specific task); but I may overlap here and there&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:large;"&gt;Take advantage of Auto-Hide &lt;br /&gt;&lt;/span&gt;Like Jimmy Bogard and Jeffery Palermo, I have my Visual Studio UI very lean. 99% of the time, I&amp;#39;m working in code.&amp;nbsp; The Solution Explorer (SE), Properties, Output, etc are auto-hide panes.&amp;nbsp; When I need to use them I hover the mouse over the tab to make them visible, do what I need to do with them, then get back to the code.&amp;nbsp; The Code Editor is the only window that isn&amp;#39;t auto-hide or floating. &lt;br /&gt;&lt;img src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/peterritchie/lean-VS2k8.JPG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:large;"&gt;Navigate find results via keyboard&lt;/span&gt; &lt;br /&gt;Whenever anything is displayed in a find results window, you can iterate each item in the list via a keystroke.&amp;nbsp; The default C# keyboard map had F8 and Shift+F8 as the shortcuts for next and previous.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Press Ctrl+Shift+F to bring up the Find in Files form. &lt;/li&gt;
&lt;li&gt;Enter &amp;quot;TODO\:.*refactor&amp;quot; in the &amp;quot;Find what&amp;quot; text box. &lt;/li&gt;
&lt;li&gt;Ensure Match case, Match whole word are unchecked. &lt;/li&gt;
&lt;li&gt;Ensure Use is checked and has Regular expressions selected. &lt;/li&gt;
&lt;li&gt;Press Alt+F to search. &lt;br /&gt;&lt;img src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/peterritchie/Find-in-Files.JPG" alt="" /&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A Find Results window is displayed that shows the results of the search. &lt;br /&gt;&lt;img src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/peterritchie/Find-Results.JPG" alt="" /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;F8&lt;/strong&gt; goes to the first result.&lt;/li&gt;
&lt;li&gt;Pressing &lt;strong&gt;F8&lt;/strong&gt; again goes to the next. &lt;/li&gt;
&lt;li&gt;Pressing &lt;strong&gt;Shift+F8&lt;/strong&gt; goes to the previous result.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See also: &lt;br /&gt;&lt;a href="http://blogs.msdn.com/saraford/archive/2008/04/18/did-you-know-you-can-use-f8-and-shift-f8-to-navigate-among-errors-in-the-output-window.aspx"&gt;http://blogs.msdn.com/saraford/archive/2008/04/18/did-you-know-you-can-use-f8-and-shift-f8-to-navigate-among-errors-in-the-output-window.aspx&lt;/a&gt; &lt;br /&gt;&lt;a href="http://blogs.msdn.com/saraford/archive/2007/11/08/did-you-know-how-to-use-f8-to-navigate-the-find-results-window.aspx"&gt;http://blogs.msdn.com/saraford/archive/2007/11/08/did-you-know-how-to-use-f8-to-navigate-the-find-results-window.aspx&lt;/a&gt; &lt;br /&gt;&lt;a href="http://blogs.msdn.com/saraford/archive/2005/03/30/403887.aspx"&gt;http://blogs.msdn.com/saraford/archive/2005/03/30/403887.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;F8 and Shift+F8 work for most lists like Find Results 1, Find Results 2, Error List, Output:Build, etc.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:large;"&gt;File name extensions when adding classes&lt;/span&gt; &lt;br /&gt;Do you find your self selecting text in the file name when you use the Add Class wizard?&amp;nbsp; Or, do you always type &amp;quot;.cs&amp;quot; at the end of your file name?&amp;nbsp; You may be happy to know you don&amp;#39;t have to do that.&amp;nbsp; Simply invoke the Add Class wizard and type the name of the class.&amp;nbsp; The wizard adds the missing .cs for you.&amp;nbsp; For example: &lt;br /&gt;Press Alt+P, C &lt;br /&gt;Enter &amp;quot;MyNewClass&amp;quot; &lt;br /&gt;Press Enter &lt;br /&gt;A file MyNewClass.cs is added to your project and it contains class named &amp;quot;MyNewClass&amp;quot;.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:large;"&gt;Consider a Custom toolbar&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;There&amp;#39;s generally only handful of toolbar buttons that you might need, especially if you&amp;#39;re a keyboard user like me.&amp;nbsp; There&amp;#39;s some things that simply don&amp;#39;t have a default keyboard mapping.&amp;nbsp; Another good reason for having a custom toolbar item with only the buttons you use is if you often change the size of your Visual Studio window.&amp;nbsp; The default layout has two or more toolbars (depending on the edition and any add-ins you have installed).&amp;nbsp; You can carefully position those toolbars so they may take up one or two lines; but when you then shrink the size of your window the get wrapped and they won&amp;#39;t restore if you expand the size of your window.&amp;nbsp; Having a single toolbar means this wrapping of toolbars can never happen.&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size:large;"&gt;Export Settings&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Once you get your UI the way you want it, you can actually save the layout.&amp;nbsp; &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click on Tools\Import and Export Settings.&lt;/li&gt;
&lt;li&gt;Select Export selected environment settings.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This is really handy if you get into low-resource situations (like the application you&amp;#39;re developing or its framework uses up too many GDI handles and Visual Studio can&amp;#39;t allocate a handle to display a toolbar or a frame.&amp;nbsp; When this happens Visual Studio actually turns off those GUI elements; when you close and restart those panes/frames are no longer displayed by default.)&lt;/p&gt;
&lt;div style="text-align:left;margin:0px;padding:4px 4px 4px 4px;" class="wlWriterHeaderFooter"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://msmvps.com/blogs/peterritchie/archive/2008/07/15/becoming-a-visual-studio-jedi.aspx&amp;amp;title=Becoming%20a%20Visual%20Studio%20Jedi%20Part%201"&gt;&lt;img border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://msmvps.com/blogs/peterritchie/archive/2008/07/15/becoming-a-visual-studio-jedi.aspx&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1640948" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development/default.aspx">Software Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Design_2F00_Coding+Guidance/default.aspx">Design/Coding Guidance</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/DevCenterPost/default.aspx">DevCenterPost</category></item><item><title>Trials and Tribulations of DataGridView, Column Selections, and Sorting</title><link>http://msmvps.com/blogs/peterritchie/archive/2008/08/26/trials-and-tribulations-of-datagridview-column-selections-and-sorting.aspx</link><pubDate>Tue, 26 Aug 2008 20:06:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1645891</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1645891</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2008/08/26/trials-and-tribulations-of-datagridview-column-selections-and-sorting.aspx#comments</comments><description>&lt;p&gt;I had to implement some &lt;em&gt;custom&lt;/em&gt; sorting in a &lt;span style="font-family:Courier New;"&gt;DataGridView&lt;/span&gt; recently.&amp;nbsp; Essentially, the stakeholders wanted full column selection (like Excel) while still having the ability to sort the data based on a particular column.&lt;/p&gt;
&lt;p&gt;This particular &lt;span style="font-family:Courier New;"&gt;DataGridView&lt;/span&gt; is data-bound.&amp;nbsp; &lt;span style="font-family:Courier New;"&gt;DataGridView&lt;/span&gt; offers the &lt;span style="font-family:courier new,courier;"&gt;Sort(DataGridViewColumn, ListSortDirection)&lt;/span&gt; method to perform this.&amp;nbsp; Nice and easy I thought: I&amp;rsquo;ll set the &lt;span style="font-family:Courier New;"&gt;SelectionMode&lt;/span&gt; to &lt;span style="font-family:Courier New;"&gt;DataGridViewSelectionMode.ColumnHeaderSelect&lt;/span&gt; and simply call &lt;span style="font-family:courier new,courier;"&gt;Sort&lt;/span&gt; with the selected column.&lt;/p&gt;
&lt;p&gt;Well, much to my chagrin this had the side effect of making that column look selected all the time.&amp;nbsp; No matter where else I clicked, that recently sorted column &lt;em&gt;looked&lt;/em&gt; selected (&lt;span style="font-family:Courier New;"&gt;SelectedColumns&lt;/span&gt; had a count of zero).&amp;nbsp; And to add insult to injury, when I control-clicked that column (thinking it was selected) to unselected it, it caused a &lt;span style="font-family:Courier New;"&gt;NullReferenceException&lt;/span&gt; deep in the framework.&lt;/p&gt;
&lt;p&gt;Suffice it to say, this makes it very difficult to sort by columns in &lt;span style="font-family:Courier New;"&gt;DataGridView&lt;/span&gt; without using the built-in sort-column-when-header-is-clicked mode.&lt;/p&gt;
&lt;p&gt;What I&amp;rsquo;m now attempting to do is to unselect the column before sorting it.&amp;nbsp; &lt;span style="text-decoration:line-through;"&gt;This, in itself, is not trivial either; there&amp;rsquo;s no public method to select or deselect a column in the &lt;span style="font-family:Courier New;"&gt;DataGridView&lt;/span&gt;.&amp;nbsp; I&amp;rsquo;ve had to create a new &lt;span style="font-family:Courier New;"&gt;DataGridView&lt;/span&gt; derivative and call the protected method &lt;span style="font-family:Courier New;"&gt;SetSelectedColumnCore&lt;/span&gt;.&amp;nbsp; A few hoops&amp;hellip;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve logged a couple of issues on Microsoft Connect about these problems.&amp;nbsp; The first is about ctrl-clicking the column and getting an exception:&amp;nbsp; &lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=363623" title="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=363623"&gt;https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=363623&lt;/a&gt; The second is about the visual state of the column remaining &amp;ldquo;selected&amp;rdquo;: &lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=363623"&gt;https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=363623&lt;/a&gt; Attached to this post you will find the project referenced by the two Connect issues.&lt;/p&gt;
&lt;p&gt;[Update: I&amp;#39;ve currently only tried this with a .NET 2.0 project in Visual Studio 2008 SP1; if you find this problem occurs in Visual 2008 RTM, please comment.]&lt;/p&gt;
&lt;p&gt;[Update: I overlooked the DataGridViewColumn.Select property, so there&amp;#39;s no need to derive from &lt;span style="font-family:courier new,courier;"&gt;DataGridView&lt;/span&gt;]&lt;/p&gt;
&lt;div style="text-align:left;margin:0px;padding:4px 4px 4px 4px;" class="wlWriterHeaderFooter"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://msmvps.com/blogs/peterritchie/archive/2008/08/26/trials-and-tribulations-of-datagridview-column-selections-and-sorting.aspx&amp;amp;title=Trials%20and%20Tribulations%20of%20DataGridView,%20Column%20Selections,%20and%20Sorting"&gt;&lt;img border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://msmvps.com/blogs/peterritchie/archive/2008/08/26/trials-and-tribulations-of-datagridview-column-selections-and-sorting.aspx&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1645891" width="1" height="1"&gt;</description><enclosure url="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.64.58.91/DataGridViewBug.zip" length="22598" type="application/x-zip-compressed" /><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development/default.aspx">Software Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Framework+Bugs/default.aspx">Framework Bugs</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Connect+Issue/default.aspx">Connect Issue</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Visual+Studio+2008+SP1/default.aspx">Visual Studio 2008 SP1</category></item><item><title>Location of unit tests.</title><link>http://msmvps.com/blogs/peterritchie/archive/2008/08/20/location-of-unit-tests.aspx</link><pubDate>Thu, 21 Aug 2008 01:24:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1645299</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1645299</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2008/08/20/location-of-unit-tests.aspx#comments</comments><description>&lt;p&gt;&lt;br /&gt;I had a short&amp;nbsp; conversation at Alt.Net Canada about the location of unit tests.&amp;nbsp; I personally tend towards a distinct unit test project.&amp;nbsp; But, I deal with mostly commercial, off-the-shelf (COTS) projects where I simply can&amp;#39;t ship code like that.&amp;nbsp; I also don&amp;#39;t want to wire-off the unit test via #if because I would then be shipping something different than that which was tested. &lt;/p&gt;
&lt;p&gt;From an enterprise application point of view, this is different.&amp;nbsp; I would have no problem including the unit tests within their respective project as production code &lt;/p&gt;
&lt;div style="text-align:left;margin:0px;padding:4px 4px 4px 4px;" class="wlWriterHeaderFooter"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://msmvps.com/blogs/peterritchie/archive/2008/08/20/location-of-unit-tests.aspx"&gt;&lt;img border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://msmvps.com/blogs/peterritchie/archive/2008/08/20/location-of-unit-tests.aspx&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1645299" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/General/default.aspx">General</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Design_2F00_Coding+Guidance/default.aspx">Design/Coding Guidance</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Pontification/default.aspx">Pontification</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/TDD/default.aspx">TDD</category></item><item><title>DataGridViewColumn.Frozen</title><link>http://msmvps.com/blogs/peterritchie/archive/2008/08/11/datagridviewcolumn-frozen.aspx</link><pubDate>Mon, 11 Aug 2008 22:34:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1640969</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1640969</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2008/08/11/datagridviewcolumn-frozen.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcolumn.frozen(VS.80).aspx"&gt;DataGridViewColumn.Frozen&lt;/a&gt; is documented as &amp;quot;When a column is frozen, all the columns to its left (or to its right in right-to-left languages) are frozen as well.&amp;quot;&lt;/p&gt; &lt;p&gt;Which is nice until you think of the consequences.&amp;nbsp; The consequences being that freezing a column and all columns to the left is performed with a single assignment of true to the Frozen property of that column; but to unfreeze is not the opposite (a assignment of false to the Frozen property of that column).&amp;nbsp; No, you must unfreeze each of those columns to the left.&amp;nbsp; This can be done by manually unfreezing each column, or by unfreezing column 0.&lt;/p&gt; &lt;p&gt;This means that column.Frozen = false is not the opposite of column.Frozen = true—resulting in unbalanced reversible side-effects.&lt;/p&gt; &lt;p&gt;Neither of the techniques to “unfreeze” the column that was frozen is intuitive; but unfortunately this interface is not &amp;quot;intention revealing&amp;quot;.&amp;nbsp; You’re not just setting the Frozen property of a column, you’re setting the frozen property of that column and all the columns to the left.&lt;/p&gt; &lt;p&gt;Greg Young recently commented (I don’t remember where) about writing classes without &lt;em&gt;any&lt;/em&gt; properties.&amp;nbsp; This approach would have helped here.&amp;nbsp; What Greg is alluding to is to recognize behaviour rather than shape.&amp;nbsp; Freezing the current column and all columns to the left is a behaviour, not an attribute; and it should be modeled as a method rather than a property.&lt;/p&gt; &lt;p&gt;At any rate, if you have a DataGridView on your form, you may be interested in using these methods instead:&lt;/p&gt; &lt;div style="border-right:black 1px solid;border-top:black 1px solid;font-size:10pt;background:white;border-left:black 1px solid;color:black;border-bottom:black 1px solid;font-family:courier new;"&gt;&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; FreezeAtColumn(&lt;span style="color:blue;"&gt;int&lt;/span&gt; value)&lt;/pre&gt;&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dataGridView.Columns[value].Frozen = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; UnfreezeColumns()&lt;/pre&gt;&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dataGridView.Columns[0].Frozen = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;/pre&gt;&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 4px 4px 4px;"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://msmvps.com/blogs/peterritchie/archive/2008/07/15/datagridviewcolumn-frozen.aspx&amp;amp;title=DataGridViewColumn.Frozen"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://msmvps.com/blogs/peterritchie/archive/2008/07/15/datagridviewcolumn-frozen.aspx&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" border="0/" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1640969" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development/default.aspx">Software Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Design_2F00_Coding+Guidance/default.aspx">Design/Coding Guidance</category></item><item><title>ITSWITCH #1: Answer</title><link>http://msmvps.com/blogs/peterritchie/archive/2008/07/28/itswitch-1-answer.aspx</link><pubDate>Mon, 28 Jul 2008 19:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1642162</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1642162</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2008/07/28/itswitch-1-answer.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://msmvps.com/blogs/peterritchie/archive/2008/07/25/itswitch-1.aspx"&gt;Last post&lt;/a&gt; I detailed some code that may or may not have something wrong in it.&amp;#160; If you thought InitializeOne and IntializeTwo are semantically identical (e.g. they differ only by performance), you&amp;#39;d be wrong.&lt;/p&gt;  &lt;p&gt;If you simply ran the code, you&amp;#39;d be able to guess where the problem is.&amp;#160; To understand what&amp;#39;s causing the problem.&amp;#160; Let&amp;#39;s look at how C# effectively implements the two loops.&lt;/p&gt;  &lt;p&gt;InitializeOne is essentially equivalent to&lt;/p&gt;  &lt;div style="border-right:black 1px solid;border-top:black 1px solid;font-size:10pt;background:white;border-left:black 1px solid;color:black;border-bottom:black 1px solid;font-family:courier new;"&gt;   &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PrivateDelegateHelper&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt; Value { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Method()&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;TestClass&lt;/span&gt;.ProcessText(Value);&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InitializeThree(&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;[] strings)&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; delegates = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;MethodInvoker&lt;/span&gt;&amp;gt;(strings.Length);&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;MethodInvoker&lt;/span&gt; cachedAnonymousDelegate = &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;PrivateDelegateHelper&lt;/span&gt; privateDelegateHelper = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PrivateDelegateHelper&lt;/span&gt;();&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;[] copyOfStrings = strings;&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; copyOfStrings.Length; ++i)&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; privateDelegateHelper.Value = copyOfStrings;&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (cachedAnonymousDelegate == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cachedAnonymousDelegate = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MethodInvoker&lt;/span&gt;(privateDelegateHelper.Method);&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; delegates.Add(cachedAnonymousDelegate);&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Now it&amp;#39;s obvious, right?&lt;/p&gt;

&lt;p&gt;For those you don&amp;#39;t want to read all the code, the problem is that only one PrivateDelegateHelper object is instantiated and its value property is set in each iteration of the loop.&amp;#160; Because the delegates aren&amp;#39;t run until sometime after the loop, they&amp;#39;re all run with the last value of the string array as their argument.&lt;/p&gt;

&lt;p&gt;The technical term for what we&amp;#39;ve implemented here is a &lt;a href="http://en.wikipedia.org/wiki/Closure_(computer_science)"&gt;closure&lt;/a&gt;.&amp;#160; If you&amp;#39;re using Resharper 4.x, you would have noticed a warning &amp;quot;Access to modified closure&amp;quot;:&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;img height="132" src="http://msmvps.com/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/peterritchie/modified-closure.JPG" width="564" alt="" /&gt;&lt;/p&gt;

&lt;p&gt;...which is attempting to tell you that the closure (the delegate and cached bound variables) has changed (in this case one of the bound variables has changed between the creation of a closure and another and out expected output is effected).&lt;/p&gt;

&lt;p&gt;By the way, you can get the same thing with C# 3+ with lambdas (i.e. you can also write closures with lambdas):&lt;/p&gt;

&lt;div style="border-right:black 1px solid;border-top:black 1px solid;font-size:10pt;background:white;border-left:black 1px solid;color:black;border-bottom:black 1px solid;font-family:courier new;"&gt;
  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; InitializeOne(&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;[] strings)&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; delegates = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;MethodInvoker&lt;/span&gt;&amp;gt;(strings.Length);&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;for&lt;/span&gt; (&lt;span style="color:blue;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; strings.Length; ++i)&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt; value = strings;&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; delegates.Add(() =&amp;gt; ProcessText(value));&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; InitializeTwo(&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;[] strings)&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; delegates = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;MethodInvoker&lt;/span&gt;&amp;gt;(strings.Length);&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt; value &lt;span style="color:blue;"&gt;in&lt;/span&gt; strings)&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; delegates.Add(() =&amp;gt; ProcessText(value));&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 4px 4px 4px;"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://msmvps.com/blogs/peterritchie/archive/2008/07/28/itswitch-1-answer.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://msmvps.com/blogs/peterritchie/archive/2008/07/28/itswitch-1-answer.aspx&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" border="0/" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1642162" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development/default.aspx">Software Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+2.0/default.aspx">.NET 2.0</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Design_2F00_Coding+Guidance/default.aspx">Design/Coding Guidance</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Pop+Quiz/default.aspx">Pop Quiz</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/ITSWITCH+Answer/default.aspx">ITSWITCH Answer</category></item><item><title>ITSWITCH: #1</title><link>http://msmvps.com/blogs/peterritchie/archive/2008/07/25/itswitch-1.aspx</link><pubDate>Fri, 25 Jul 2008 18:58:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1642154</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1642154</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2008/07/25/itswitch-1.aspx#comments</comments><description>&lt;p&gt;Is There Something Wrong In This Code Here&lt;/p&gt;
&lt;p&gt;&lt;span style="color:#ff0000;"&gt;UPDATE: as several readers pointed out there was compile error in the code what was being displayed.&amp;nbsp; The line &amp;quot;String value = string&amp;quot; was showing up as &amp;quot;String value = string&amp;quot;.&amp;nbsp; I&amp;#39;m not sure why; but throwing some spaces between the i and the square brackets seems to have solved it.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In the following class, is there something wrong with either InitializeOne or InitializeTwo (hint, it has nothing to do with compile errors and I&amp;#39;m ignoring&amp;nbsp;performance differences)?&lt;/p&gt;
&lt;div style="font-size:10pt;background:white;color:black;font-family:Courier New;border:black 1px solid;"&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TestClass&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;MethodInvoker&lt;/span&gt;&amp;gt; delegates;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; ProcessText(&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt; text)&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Trace&lt;/span&gt;.WriteLine(text);&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Run()&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;MethodInvoker&lt;/span&gt; invoker &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; delegates)&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; invoker();&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InitializeOne(&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;[] strings)&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; delegates = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;MethodInvoker&lt;/span&gt;&amp;gt;(strings.Length);&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; strings.Length; ++i)&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt; value = strings[ i ];&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; delegates.Add(&lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt; { ProcessText(value); });&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; InitializeTwo(&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;[] strings)&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; delegates = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;MethodInvoker&lt;/span&gt;&amp;gt;(strings.Length);&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt; value &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; strings)&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; delegates.Add(&lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt; { ProcessText(value); });&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Answer on Monday.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1642154" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development/default.aspx">Software Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+2.0/default.aspx">.NET 2.0</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Design_2F00_Coding+Guidance/default.aspx">Design/Coding Guidance</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Pop+Quiz/default.aspx">Pop Quiz</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/ITSWITCH/default.aspx">ITSWITCH</category></item><item><title>Working with Resharper's External Annotation XML Files</title><link>http://msmvps.com/blogs/peterritchie/archive/2008/07/21/working-with-resharper-s-external-annotation-xml-files.aspx</link><pubDate>Mon, 21 Jul 2008 20:32:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1640964</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1640964</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2008/07/21/working-with-resharper-s-external-annotation-xml-files.aspx#comments</comments><description>&lt;p&gt;Resharper 4.0 has external annotation XML files that you can create to give Resharper more information about your code.&amp;nbsp; For example, you can tell Resharper that a particular method does not accept a null argument.&amp;nbsp; For example, the following method does not accept a null argument:&lt;/p&gt;
&lt;div style="font-size:10pt;background:white;color:black;font-family:Courier New;border:black 1px solid;"&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; System;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; Utility&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Text&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetLength(&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt; text)&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (text == &lt;span style="color:blue;"&gt;null&lt;/span&gt;) &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; text.Length;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;An external annotation file can be created to inform Resharper of this fact and have it warn you when possible null values are passed as an argument:&lt;/p&gt;
&lt;div style="font-size:10pt;background:white;color:black;font-family:Courier New;border:black 1px solid;"&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt; text = &lt;span style="color:blue;"&gt;null&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Utility.Text.GetLength(text);&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;First, you need to create a directory within the Resharper ExternalAnnotations directory.&amp;nbsp; This ExternalAnnotations directory is usually in the form of &amp;quot;%SystemDrive%\Program Files\JetBrains\ReSharper\vBuild#\Bin\ExternalAnnotations&amp;quot; for example &amp;quot;C:\Program Files\JetBrains\ReSharper\v4.0.816.4\Bin\ExternalAnnotations&amp;quot;.&lt;/p&gt;
&lt;p&gt;The directory we need to create is the same name as our assembly (without the extension).&amp;nbsp; In our case this would be &amp;quot;C:\Program Files\JetBrains\ReSharper\v4.0.816.4\Bin\ExternalAnnotations\Utility&amp;quot;.&lt;/p&gt;
&lt;p&gt;Next, we need to create an XML file to contain the information required by Resharper.&amp;nbsp; The name of this file is the same as the directory name, plus &amp;quot;.xml&amp;quot;.&amp;nbsp; So, the full file name would be &amp;quot;C:\Program Files\JetBrains\ReSharper\v4.0.816.4\Bin\ExternalAnnotations\Utility\Utility.xml&amp;quot;.&amp;nbsp; This file essentially has an assembly element with child member elements that provide meta-data about methods and arguments.&amp;nbsp; In our case we want to tell Resharper that the Utility.Text.GetLength(String) method does not accept null values for the argument named &amp;quot;text&amp;quot;.&amp;nbsp; To do this we populate the file with the following XML:&lt;/p&gt;
&lt;div style="font-size:10pt;background:white;color:black;font-family:Courier New;border:black 1px solid;"&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xml&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;version&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;1.0&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;encoding&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;utf-8&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; ?&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;assembly&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;Utility&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;member&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;M:Utility.Text.GetLength(System.String)&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;parameter&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;text&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;attribute&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;ctor&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;M:JetBrains.Annotations.NotNullAttribute.#ctor&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;parameter&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;member&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;assembly&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;After restarting Visual Studio, Resharper will now warn that &amp;quot;text&amp;quot;, when passed to GetLength, in the following code, has a &amp;quot;Possible &amp;#39;null&amp;#39; assignment to entity marked with &amp;quot;NotNull&amp;quot; attribute&amp;quot;.&lt;/p&gt;
&lt;div style="font-size:10pt;background:white;color:black;font-family:Courier New;border:black 1px solid;"&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;String&lt;/span&gt; text = &lt;span style="color:blue;"&gt;null&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Utility.Text.GetLength(text);&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;I&amp;#39;ve tried this with the GA build and with both Visual Studio 2005 (SP1) and Visual Studio 2008.&lt;/p&gt;
&lt;p&gt;For more information about the annotation options, search for AssertionConditionType in the Resharper help and browse around &amp;quot;%SystemDrive%\Program Files\JetBrains\ReSharper\vBuild#\Bin\ExternalAnnotations&amp;quot; for examples.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1640964" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development/default.aspx">Software Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Resharper/default.aspx">Resharper</category></item><item><title>Drag-copying in Visual Studio Solution Explorer.</title><link>http://msmvps.com/blogs/peterritchie/archive/2008/07/18/drag-copying-in-visual-studio-solution-explorer.aspx</link><pubDate>Fri, 18 Jul 2008 16:46:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1640926</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1640926</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2008/07/18/drag-copying-in-visual-studio-solution-explorer.aspx#comments</comments><description>&lt;p&gt;NOTE: I&amp;#39;ve tried this in Visual Studio 2008 (VS2k8), I&amp;#39;m assuming the same thing happens in Visual Studio 2005 (VS2k5).&lt;/p&gt;
&lt;p&gt;In the process of refactoring, it&amp;#39;s *very* common for me to rename a type.&amp;nbsp; This is most easily done by renaming the file in the Solution Explorer (SE)--which renames the file, the type, and and any uses of the type in the entire solution.&lt;/p&gt;
&lt;p&gt;Occasionally, I need to create a new type based on another.&amp;nbsp; Copying an abstract type in order to implement the abstract type is often handy--I just fill in the abstract members (and delete &amp;quot;abstract&amp;quot;) in the copied type after renaming it.&lt;/p&gt;
&lt;p&gt;Drag-copy in the SE seems like it would take care of a couple of steps at once for me: make a copy and rename it.&amp;nbsp; Unfortunately it doesn&amp;#39;t do that.&amp;nbsp; It makes a copy of the file (as &amp;quot;Copy of typename.xx&amp;quot;) but doesn&amp;#39;t rename any types in the class that match the file name.&lt;/p&gt;
&lt;p&gt;This might seem somewhat trivial... I can simply rename the file name then refactor rename the type in the file so that the type and all it&amp;#39;s constructors are renamed in one fell swoop.&amp;nbsp; Alas, this simply opens a can of worms that can completely confound a newcomer and annoy an expert.&lt;/p&gt;
&lt;p&gt;That simple, intuitive method of renaming a copy of a file then the type within the file actually renames *all* types of that name.&amp;nbsp; Since we&amp;#39;ve just made a copy of the type, that means it&amp;#39;s always going rename types in two files.&amp;nbsp; The side-effect of drag-copy in SE means you *must* manually rename the type in the file you just copied.&amp;nbsp; You can do this with search-replace; but that&amp;#39;s friction I don&amp;#39;t want and really makes SE drag-copy unusable.&lt;/p&gt;
&lt;p&gt;I&amp;#39;ve &lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=355239"&gt;logged a bug about it on Connect&lt;/a&gt;; but the olde &amp;quot;by design&amp;quot; card was played... &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1640926" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development/default.aspx">Software Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Product+Bugs/default.aspx">Product Bugs</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Poor+UI/default.aspx">Poor UI</category></item><item><title>Nested Types</title><link>http://msmvps.com/blogs/peterritchie/archive/2008/07/15/nested-types.aspx</link><pubDate>Tue, 15 Jul 2008 14:47:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1640904</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1640904</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2008/07/15/nested-types.aspx#comments</comments><description>&lt;p&gt;Recently &lt;a href="http://www.michaelfeathers.com/"&gt;Michael Features&lt;/a&gt; &lt;a href="http://michaelfeathers.typepad.com/michael_feathers_blog/2008/06/are-nested-clas.html"&gt;blogged about nested types&lt;/a&gt;.&amp;nbsp; The title was almost &amp;quot;nested types considered harmful&amp;quot;.&lt;/p&gt;
&lt;p&gt;I don&amp;#39;t agree.&amp;nbsp; I don&amp;#39;t agree that they&amp;#39;re any more harmful than any other C# construct (except goto...).&amp;nbsp; Nested types are like anything else in our tool-belt: they have a time and place and can be abused.&lt;/p&gt;
&lt;p&gt;But, when to use them?&amp;nbsp; Well, for the most part I agree with Michael, you should avoid them. But, there are times when they&amp;#39;re simply the best solution in a given set of circumstances.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s look at asynchronous programming model (APM) in .NET.&lt;/p&gt;
&lt;div style="BORDER-RIGHT:black 1px solid;BORDER-TOP:black 1px solid;FONT-SIZE:10pt;BACKGROUND:white;BORDER-LEFT:black 1px solid;COLOR:black;BORDER-BOTTOM:black 1px solid;FONT-FAMILY:Courier New;"&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// Paraphrased from MSDN&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&lt;span style="color:#008000;"&gt;        // Accept one client connection asynchronously.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; DoBeginAcceptTcpClient(&lt;span style="color:#2b91af;"&gt;TcpListener&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; listener)&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// Start to listen for connections from a client.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Trace&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;Waiting for a connection...&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// Accept the connection. &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// BeginAcceptSocket() creates the accepted socket.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; listener.BeginAcceptTcpClient(&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; DoAcceptTcpClientCallback,&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; listener);&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// Process the client connection.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; DoAcceptTcpClientCallback(&lt;span style="color:#2b91af;"&gt;IAsyncResult&lt;/span&gt; ar)&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// Get the listener that handles the client request.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;TcpListener&lt;/span&gt; listener = (&lt;span style="color:#2b91af;"&gt;TcpListener&lt;/span&gt;)ar.AsyncState;&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// End the operation and display the received data on &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// the console.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;TcpClient&lt;/span&gt; client = listener.EndAcceptTcpClient(ar);&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// TODO: do something with client.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// Process the connection here. (Add the client to a&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// server table, read data, etc.)&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Trace&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;Client connected completed&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="BACKGROUND:cornsilk;MARGIN:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;In this simple scenario we are getting by with a state of simply a TcpListener object.&amp;nbsp; In a more complex scenario, you&amp;#39;ll likely also want a connection-specific queue, some sort of information about what to do after a connection, etc.&amp;nbsp; While you can use existing types of have several collection instance fields to keep track of each of these things; you then have to introduce synchronization of those collections, managing the content of those collections, etc.--it&amp;#39;s much easier and safer to send that information on the stack.&amp;nbsp; One method I&amp;#39;ve tried is simply passing an Object collection as the state; but that quickly becomes hard to manage because of the lack of type-safety on the elements in the array (if I remove an element and replace it with another type, the compile can&amp;#39;t know and I&amp;#39;ll get a run-time error instead of a compile-time error).&amp;nbsp; To get type safety I generally introduce a new type to aggregate all the types I need in this asynchronous callback.&amp;nbsp; While this new type *could* be reusable by other classes; it likely isn&amp;#39;t and I don&amp;#39;t want to then be bound that that explicit contract I&amp;#39;ve signed by making the types publicly available.&amp;nbsp; The only option of not making them publicly available is as private nested types.&amp;nbsp; For example: &lt;/p&gt;

&lt;div style="font-size:10pt;background:white;color:black;font-family:Courier New;border:black 1px solid;"&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AcceptTcpClientParameters&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;CommandQueue&lt;/span&gt; CommandQueue { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Command&lt;/span&gt; NextCommand { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;TcpListener&lt;/span&gt; TcpListener { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; AcceptTcpClientParameters(&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; commandQueue, &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; nextCommand, &lt;span style="color:#2b91af;"&gt;TcpListener&lt;/span&gt; tcpListener)&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; CommandQueue = commandQueue;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; NextCommand = nextCommand;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; TcpListener = tcpListener;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// Accept one client connection asynchronously.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; DoBeginAcceptTcpClient(&lt;span style="color:#2b91af;"&gt;TcpListener&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; listener, &lt;span style="color:#2b91af;"&gt;CommandQueue&lt;/span&gt; commandQueue, &lt;span style="color:#2b91af;"&gt;Command&lt;/span&gt; nextCommand)&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// Start to listen for connections from a client.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Trace&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515;"&gt;&amp;quot;Waiting for a connection...&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// Accept the connection. &lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// BeginAcceptSocket() creates the accepted socket.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; listener.BeginAcceptTcpClient(&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; DoAcceptTcpClientCallback,&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AcceptTcpClientParameters&lt;/span&gt;(commandQueue, nextCommand, listener));&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;// Process the client connection.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; DoAcceptTcpClientCallback(&lt;span style="color:#2b91af;"&gt;IAsyncResult&lt;/span&gt; ar)&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;AcceptTcpClientParameters&lt;/span&gt; parameters = ar.AsyncState &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AcceptTcpClientParameters&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;(parameters == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;) &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;TcpClient&lt;/span&gt; client = parameters.TcpListener.EndAcceptTcpClient(ar);&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; parameters.NextCommand.Process(parameters.CommandQueue, client);&lt;/pre&gt;
&lt;pre style="background:cornsilk;margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;I find this use of nested types to be more object-oriented (the needs of the DoAcceptTcpClientCallback are abstracted), more intention revealing, better implements Single Responsibility Principle (SRP), better separates concerns, more maintainable and more agile.&lt;/p&gt;
&lt;p&gt;Now, to be clear; this is forced set of circumstances.&amp;nbsp; You&amp;#39;re using a library that implements the APM (right?&amp;nbsp; You haven&amp;#39;t implemented APM yourself...).&amp;nbsp; But, that&amp;#39;s my point--nested types are almost essential in a given set of circumstances.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fmsmvps.com%2fblogs%2fpeterritchie%2farchive%2f2008%2f07%2f15%2fnested-types.aspx"&gt;&lt;img border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmsmvps.com%2fblogs%2fpeterritchie%2farchive%2f2008%2f07%2f15%2fnested-types.aspx" alt="kick it on DotNetKicks.com" /&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1640904" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development/default.aspx">Software Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Design_2F00_Coding+Guidance/default.aspx">Design/Coding Guidance</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_+3.0/default.aspx">C# 3.0</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+3.5/default.aspx">.NET 3.5</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/TCP/default.aspx">TCP</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Asynchronous+Programming+Model+_2800_APM_2900_/default.aspx">Asynchronous Programming Model (APM)</category></item><item><title>Sandcastle Source Code Published</title><link>http://msmvps.com/blogs/peterritchie/archive/2008/07/02/sandcastle-source-code-published.aspx</link><pubDate>Wed, 02 Jul 2008 18:15:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1639145</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1639145</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2008/07/02/sandcastle-source-code-published.aspx#comments</comments><description>&lt;p&gt;The source for the Sandcastle project has been &lt;a href="http://www.codeplex.com/Sandcastle/SourceControl/ListDownloadableCommits.aspx"&gt;published&lt;/a&gt;.&amp;nbsp; This is great news.&lt;/p&gt;
&lt;p&gt;For more information, see &lt;a href="http://www.codeplex.com/Sandcastle/SourceControl/ListDownloadableCommits.aspx"&gt;http://www.codeplex.com/Sandcastle/SourceControl/ListDownloadableCommits.aspx&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1639145" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Interesting+Find/default.aspx">Interesting Find</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development/default.aspx">Software Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Open+Source/default.aspx">Open Source</category></item><item><title>Comparing CodeRush Refactor! Pro and Resharper 4, part 1 or N -- first glance.</title><link>http://msmvps.com/blogs/peterritchie/archive/2008/06/25/comparing-coderush-refactor-pro-and-resharper-4-part-1-or-n-first-glance.aspx</link><pubDate>Thu, 26 Jun 2008 01:17:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1637792</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1637792</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2008/06/25/comparing-coderush-refactor-pro-and-resharper-4-part-1-or-n-first-glance.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;Metadata view of code in referenced assemblies&lt;br /&gt;&lt;/strong&gt;This is a big one for me.&amp;nbsp; For whatever reason, Refactor 4 (and prior) completely disables this and sends you to the Object Browser instead.&amp;nbsp;&amp;nbsp; You get metadata view with CodeRush Refactor! Pro.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keyboard layout&lt;br /&gt;&lt;/strong&gt;As you might imagine, CodeRush Refactor! Pro and Resharper had completely different keyboard layouts.&amp;nbsp; So, if you&amp;#39;re used to R# then Refactor! Pro will take a bit of getting used to.&lt;/p&gt;
&lt;p&gt;One thing I don&amp;#39;t like with the default Refactor! Pro keyboard layout, is they&amp;#39;ve replaced Ctrl-. with Quick Navigation.&amp;nbsp; I use Ctrl-. (instead of Shift-Alt-F10 to get at the smart-tag menu).&amp;nbsp; Shift-Alt-F10 for smart-tag menu seems more common; so I&amp;#39;ll have to get use to Shift-Alt-F10.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Refactor! Pro&amp;#39;s Editor enhancements&lt;br /&gt;&lt;/strong&gt;R# doesn&amp;#39;t change to how the editor looks as much as CodeRush Refactor! Pro.&amp;nbsp; It has the Marker Bar, error/warning/info colouring, and action light-bulbs.&amp;nbsp; Refactor! Pro with CodeRush has many more, like region painting, flow-break evaluation, Visibility Icons, structural highlighting,&amp;nbsp;etc. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Real-time analysis&lt;br /&gt;&lt;/strong&gt;Both R# and CodeRush Refactor! Pro do real-time code analysis.&amp;nbsp; R# has text colouring and the right-hand marker bar.&amp;nbsp; CodeRush Refactor Pro has a marker bar on both the left and the right.&amp;nbsp; The left marker bar in CodeRush Refactor! Pro highlights issues for each line, and the right (as does R#) shows a file-wide view of issues.&amp;nbsp; I find the R# marker bar sometimes doesn&amp;#39;t align with the scroll bar so that an issue may be beside the scroll-bar in the marker bar but is actually scrolled off the screen.&amp;nbsp; CodeRush Refactor Pro doesn&amp;#39;t do that and in fact shows the visible portion of the document in its marker bar.&amp;nbsp; i.e. the marker bar is beside the Visual Studio Indicator Margin (where the breakpoint bullets appear).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Refactorings&lt;br /&gt;&lt;/strong&gt;They both have many of the same refactorings.&amp;nbsp; When it comes to non-refactorings the two sometimes approach things differently.&amp;nbsp; For example R# deals with adding members to a class through &amp;quot;Generate Code&amp;quot; list; whereas CodeRush Refactor Pro uses templates.&amp;nbsp; E.g. in R#, to add a constructor you hit Alt-Ins and select Constructor.&amp;nbsp; With Refactor you simply enter &amp;quot;cc &amp;quot;(that &amp;#39;c&amp;#39;, &amp;#39;c&amp;#39;, space).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Smart-Tags&lt;/strong&gt;&lt;br /&gt;Both approach smart-tags slightly differently.&amp;nbsp; With R# they use the actions light-bulb at the left margin.&amp;nbsp; This includes fixes for warnings, errors, plus refactorings, but doesn&amp;#39;t include code generation options.&amp;nbsp; CodeRush Refactor Pro uses an ellipsis-like icon that appears right at the site of the potential refactoring. Code Refactor Pro is a richer experience.&amp;nbsp; It will show you the result of a refactoring with arrows showing where things will move, red strike-out showing what will be removed, and highlights for things that will be changed/renamed. &lt;br /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1637792" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development/default.aspx">Software Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Resharper/default.aspx">Resharper</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/CodeRush+Refactor_2100_+Pro/default.aspx">CodeRush Refactor! Pro</category></item><item><title>Entity Framework Petition of Vote of Non Confidence</title><link>http://msmvps.com/blogs/peterritchie/archive/2008/06/25/entity-framework-petition-of-vote-of-non-confidence.aspx</link><pubDate>Wed, 25 Jun 2008 17:21:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1637616</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1637616</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2008/06/25/entity-framework-petition-of-vote-of-non-confidence.aspx#comments</comments><description>&lt;p&gt;I had intended to be happy simply being a signatory of ADO .NET Entity Framework Vote of No Confidence.&amp;nbsp; But, there&amp;#39;s people suggesting signatories of this petition are wackos or on the fringe.&lt;/p&gt;
&lt;p&gt;Do yourself a favour and read &lt;a class="" href="http://efvote.wufoo.com/forms/ado-net-entity-framework-vote-of-no-confidence/"&gt;the petition&lt;/a&gt;.&amp;nbsp; Read what we have issues with and how we think Entity Framework (EF) can be improved to be a better product.&amp;nbsp; Read seminal material by industry leaders on entity-oriented and object-oriented application development like &lt;a class="" href="http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1214414934&amp;amp;sr=1-1"&gt;Domain Driven Design&lt;/a&gt;, and &lt;a class="" href="http://www.amazon.com/Principles-Patterns-Practices-Robert-Martin/dp/0131857258"&gt;Agile Principles, Patterns and Practices in C#&lt;/a&gt; (and the predecessor &lt;a class="" href="http://www.amazon.com/Software-Development-Principles-Patterns-Practices/dp/0135974445"&gt;Agile Software Development: Principles, Patterns&amp;nbsp;and Practices&lt;/a&gt;) and &lt;a class="" href="http://www.amazon.com/Applying-Domain-Driven-Design-Patterns-Examples/dp/0321268202/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1214415016&amp;amp;sr=1-1"&gt;Applying Domain-Driven Design and Patterns: With Examples in C# and .NET&lt;/a&gt;.&amp;nbsp; If after you have understand this information, you think being forced to use EF on a software development&amp;nbsp;team would mean it would be hard to implement generally accepted object-oriented and entity-oriented design, the sign the petition.&lt;/p&gt;
&lt;p&gt;Yes, you have the choice no to use EF; but you also have the choice to help people to not have to deal with the issues detailed in the petition simply because they were not made aware of them.&lt;/p&gt;
&lt;p&gt;And despite the naysayers&amp;nbsp;of people who think EF should improve, the ADO.NET team &lt;a class="" href="http://blogs.msdn.com/efdesign/archive/2008/06/23/transparency-in-the-design-process.aspx"&gt;is listening and agrees&lt;/a&gt;.&lt;/p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fmsmvps.com%2fblogs%2fpeterritchie%2farchive%2f2008%2f06%2f25%2fentity-framework-petition-of-vote-of-non-confidence.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmsmvps.com%2fblogs%2fpeterritchie%2farchive%2f2008%2f06%2f25%2fentity-framework-petition-of-vote-of-non-confidence.aspx" border="0" /&gt;&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1637616" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Software+Development/default.aspx">Software Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Design_2F00_Coding+Guidance/default.aspx">Design/Coding Guidance</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Microsoft/default.aspx">Microsoft</category></item><item><title>Spaces or Tabs?</title><link>http://msmvps.com/blogs/peterritchie/archive/2008/05/26/spaces-or-tabs.aspx</link><pubDate>Mon, 26 May 2008 14:25:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1627501</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1627501</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2008/05/26/spaces-or-tabs.aspx#comments</comments><description>&lt;p&gt;In this day and age it seems silly to get into a discussion about whether your companies coding guidelines should have a section mandating either spaces or tabs for indents.&amp;nbsp; Tabs are clearly more flexible, but I really don&amp;#39;t think it matters at all; people can easily read code that contains spaces or tabs.&lt;/p&gt;
&lt;p&gt;But, Microsoft has departed from what seems to be the rest of the world and is mandating spaces in their new Microsoft Source Analysis Tool for C#.&lt;/p&gt;
&lt;p&gt;Word is that an update will not only mandate spaces but mandate 4 for indents.&lt;/p&gt;
&lt;p&gt;Again, I don&amp;#39;t think it&amp;#39;s much of an issue; except Microsoft Source Analysis Tool for C# doesn&amp;#39;t offer a rule to mandate tabs over spaces.&amp;nbsp; They&amp;#39;re not providing a tool for organizations to use to enforce local coding guidines, but providing a tool to mandate Microsoft&amp;#39;s coding guidelines.&lt;/p&gt;
&lt;p&gt;The tool can be downloaded &lt;a class="" href="http://code.msdn.microsoft.com/sourceanalysis/Release/ProjectReleases.aspx?ReleaseId=1047"&gt;here&lt;/a&gt; and a discussion on tabs can be found &lt;a class="" href="http://code.msdn.microsoft.com/sourceanalysis/Thread/View.aspx?ThreadId=382"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fmsmvps.com%2fblogs%2fpeterritchie%2farchive%2f2008%2f05%2f26%2fspaces-or-tabs.aspx"&gt;&lt;img alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmsmvps.com%2fblogs%2fpeterritchie%2farchive%2f2008%2f05%2f26%2fspaces-or-tabs.aspx" border="0" /&gt;&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1627501" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Design_2F00_Coding+Guidance/default.aspx">Design/Coding Guidance</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Microsoft/default.aspx">Microsoft</category></item></channel></rss>