<?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>Paulo Morgado : C#</title><link>http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx</link><description>Tags: C#</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>LINQ To SQL Tips &amp; Tricks: String Operations</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/10/13/linq-to-sql-tips-amp-tricks-string-operations.aspx</link><pubDate>Tue, 13 Oct 2009 00:51:43 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1732069</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1732069</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1732069</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/10/13/linq-to-sql-tips-amp-tricks-string-operations.aspx#comments</comments><description>&lt;a title="LINQ With C# (Portuguese)" href="http://bit.ly/Livro-LINQ-Com-Charp" target="_blank"&gt;&lt;img style="border-right-width:0px;margin:0px 0px 10px 10px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="LINQ With C# (Portuguese)" border="0" alt="LINQ With C# (Portuguese)" align="right" src="http://www.fca.pt/ximages/722_547.gif" width="99" height="140" /&gt;&lt;/a&gt;   &lt;p align="justify"&gt;&lt;a title="Language-Integrated Query (LINQ)" href="http://msdn.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt; brought developers a very user friendly and domain independent style of writing queries.&lt;/p&gt;  &lt;p align="justify"&gt;The fact that the way queries are written is domain independent doesn’t mean that any query will compile the same way or even run the same way. You’ll always need to know how the provider will behave.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;a title="LINQ to Objects" href="http://msdn.microsoft.com/library/bb397919.aspx" target="_blank"&gt;LINQ To Objects&lt;/a&gt;, for example, will compile queries as a &lt;strong&gt;Func&amp;lt;&amp;gt;&lt;/strong&gt; delegate and the query methods will return &lt;a title="IEnumerable(T) Interface" href="http://msdn.microsoft.com/library/9eekhta0.aspx" target="_blank"&gt;IEnumerable(T)&lt;/a&gt; implementations.&lt;/p&gt;  &lt;p align="justify"&gt;On the other hand, &lt;a title="LINQ To SQL" href="http://msdn.microsoft.com/library/bb386976.aspx" target="_blank"&gt;LINQ To SQL&lt;/a&gt; will compile queries as an &lt;strong&gt;Expression&amp;lt;Func&amp;lt;&amp;gt;&amp;gt;&lt;/strong&gt; (which is, in fact, an expression tree) instance and the query methods will return &lt;a title="IQueryable(T) Interface" href="http://msdn.microsoft.com/library/bb351562.aspx" target="_blank"&gt;IQueryable(T)&lt;/a&gt; implementations.&lt;/p&gt;  &lt;p align="justify"&gt;Because LINQ To SQL queries are compiled to an expression tree, that allows the provider to treat the query elements as it sees fit.&lt;/p&gt;  &lt;p align="justify"&gt;In this case, this means that all operations that can be done on the database will be done on the database and the developer must be aware of this when she/he is writing the queries.&lt;/p&gt;  &lt;p align="justify"&gt;Lets take an example using the &lt;strong&gt;AdventureWorks&lt;/strong&gt; database (if you don’t have it, you can download it from &lt;a title="Microsoft SQL Server Product Samples: Database" href="http://msftdbprodsamples.codeplex.com/" target="_blank"&gt;here&lt;/a&gt;).&lt;/p&gt;  &lt;p align="justify"&gt;I want to build a list of salutation for every employee that has the &lt;strong&gt;SalariedFlag&lt;/strong&gt; set, in the form of:&lt;/p&gt;  &lt;p style="padding-left:1em;" align="justify"&gt;[Mr.|Mrs.|Miss] &amp;lt;first name&amp;gt; &amp;lt;middle name&amp;gt; &amp;lt;last name&amp;gt;&lt;/p&gt;  &lt;p align="justify"&gt;But there’s also one detail about the data in the database: FirstName, MiddleName and LastName may have trailing spaces and I don’t want them.&lt;/p&gt;  &lt;p align="justify"&gt;This is a simple query like this:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;q1 = &lt;span style="color:blue;"&gt;from &lt;/span&gt;e &lt;span style="color:blue;"&gt;in &lt;/span&gt;context.Employees
         &lt;span style="color:blue;"&gt;where &lt;/span&gt;e.SalariedFlag
         &lt;span style="color:blue;"&gt;select
            &lt;/span&gt;((e.Gender == &lt;span style="color:#a31515;"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;) ? ((e.MaritalStatus == &lt;span style="color:#a31515;"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;) ? &lt;span style="color:#a31515;"&gt;&amp;quot;Miss&amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot;Mrs.&amp;quot;&lt;/span&gt;) : &lt;span style="color:#a31515;"&gt;&amp;quot;Mr.&amp;quot;&lt;/span&gt;) + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+
            e.Person.FirstName.Trim() +
            (e.Person.MiddleName == &lt;span style="color:blue;"&gt;null &lt;/span&gt;|| e.Person.MiddleName.Trim().Length == 0 ? &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ e.Person.MiddleName.Trim() + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot;&lt;/span&gt;) +
            e.Person.LastName.Trim();&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;and it will be executed as:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;SELECT &lt;/span&gt;&lt;span style="color:gray;"&gt;((((
    (&lt;/span&gt;&lt;span style="color:blue;"&gt;CASE
        WHEN &lt;/span&gt;&lt;span style="color:magenta;"&gt;UNICODE&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Gender]&lt;span style="color:gray;"&gt;) = &lt;/span&gt;@p0 &lt;span style="color:blue;"&gt;THEN
            &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;CASE
                WHEN &lt;/span&gt;&lt;span style="color:magenta;"&gt;UNICODE&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MaritalStatus]&lt;span style="color:gray;"&gt;) = &lt;/span&gt;@p1 &lt;span style="color:blue;"&gt;THEN &lt;/span&gt;@p2
                &lt;span style="color:blue;"&gt;ELSE &lt;/span&gt;@p3
             &lt;span style="color:blue;"&gt;END&lt;/span&gt;&lt;span style="color:gray;"&gt;)
        &lt;/span&gt;&lt;span style="color:blue;"&gt;ELSE &lt;/span&gt;&lt;span style="color:magenta;"&gt;CONVERT&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;NVarChar&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;4&lt;span style="color:gray;"&gt;),&lt;/span&gt;@p4&lt;span style="color:gray;"&gt;)
     &lt;/span&gt;&lt;span style="color:blue;"&gt;END&lt;/span&gt;&lt;span style="color:gray;"&gt;)) + &lt;/span&gt;@p5&lt;span style="color:gray;"&gt;) + &lt;/span&gt;&lt;span style="color:magenta;"&gt;LTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;RTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[FirstName]&lt;span style="color:gray;"&gt;))) + (
    (&lt;/span&gt;&lt;span style="color:blue;"&gt;CASE
        WHEN &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MiddleName] &lt;span style="color:gray;"&gt;IS NULL) OR (&lt;/span&gt;&lt;span style="color:magenta;"&gt;LEN&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;LTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;RTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MiddleName]&lt;span style="color:gray;"&gt;))) = &lt;/span&gt;@p6&lt;span style="color:gray;"&gt;) &lt;/span&gt;&lt;span style="color:blue;"&gt;THEN &lt;/span&gt;&lt;span style="color:magenta;"&gt;CONVERT&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:blue;"&gt;NVarChar&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;MAX&lt;/span&gt;&lt;span style="color:gray;"&gt;),&lt;/span&gt;@p7&lt;span style="color:gray;"&gt;)
        &lt;/span&gt;&lt;span style="color:blue;"&gt;ELSE &lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;@p8 &lt;span style="color:gray;"&gt;+ &lt;/span&gt;&lt;span style="color:magenta;"&gt;LTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;RTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MiddleName]&lt;span style="color:gray;"&gt;))) + &lt;/span&gt;@p9
     &lt;span style="color:blue;"&gt;END&lt;/span&gt;&lt;span style="color:gray;"&gt;))) + &lt;/span&gt;&lt;span style="color:magenta;"&gt;LTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;&lt;span style="color:magenta;"&gt;RTRIM&lt;/span&gt;&lt;span style="color:gray;"&gt;(&lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[LastName]&lt;span style="color:gray;"&gt;)) &lt;/span&gt;&lt;span style="color:blue;"&gt;AS &lt;/span&gt;[value]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;[HumanResources]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Employee] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t0]
&lt;span style="color:gray;"&gt;INNER JOIN &lt;/span&gt;[Person]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Person] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t1] &lt;span style="color:blue;"&gt;ON &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID] &lt;span style="color:gray;"&gt;= &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID]
&lt;span style="color:blue;"&gt;WHERE &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[SalariedFlag] &lt;span style="color:gray;"&gt;= &lt;/span&gt;1
&lt;span style="color:green;"&gt;-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [70]
-- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [83]
-- @p2: Input NVarChar (Size = 4; Prec = 0; Scale = 0) [Miss]
-- @p3: Input NVarChar (Size = 4; Prec = 0; Scale = 0) [Mrs.]
-- @p4: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [Mr.]
-- @p5: Input NVarChar (Size = 1; Prec = 0; Scale = 0) [ ]
-- @p6: Input Int (Size = 0; Prec = 0; Scale = 0) [0]
-- @p7: Input NVarChar (Size = 1; Prec = 0; Scale = 0) [ ]
-- @p8: Input NVarChar (Size = 1; Prec = 0; Scale = 0) [ ]
-- @p9: Input NVarChar (Size = 1; Prec = 0; Scale = 0) [ ]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4926&lt;/span&gt;&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;If you notice the query, there are a lot of text operations going on for each row.&lt;/p&gt;

&lt;p align="justify"&gt;Depending on the number of rows or database load this can prove to be very bad. The result might even be just a timeout.&lt;/p&gt;

&lt;p align="justify"&gt;So, how do we force the string operations to occur on the client instead of the database?&lt;/p&gt;

&lt;p align="justify"&gt;Only &lt;strong&gt;IQueryable&amp;lt;T&amp;gt;&lt;/strong&gt; will be translated to T-SQL. So, all we need to do is change the type of the enumerator being iterated.&lt;/p&gt;

&lt;p align="justify"&gt;One way to do this is using the the &lt;a title="Enumerable.AsEnumerable(TSource) Method" href="http://msdn.microsoft.com/library/bb335435.aspx" target="_blank"&gt;AsEnumerable&lt;/a&gt; method of the &lt;a title="Enumerable Class" href="http://msdn.microsoft.com/library/system.linq.enumerable.aspx" target="_blank"&gt;Enumerable&lt;/a&gt; class.&lt;/p&gt;

&lt;p align="justify"&gt;The query would now be written as:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;q2 = &lt;span style="color:blue;"&gt;from &lt;/span&gt;e &lt;span style="color:blue;"&gt;in &lt;/span&gt;context.Employees.Where(e =&amp;gt; e.SalariedFlag).AsEnumerable()
         &lt;span style="color:blue;"&gt;select
            &lt;/span&gt;((e.Gender == &lt;span style="color:#a31515;"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;) ? ((e.MaritalStatus == &lt;span style="color:#a31515;"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;) ? &lt;span style="color:#a31515;"&gt;&amp;quot;Miss&amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot;Mrs.&amp;quot;&lt;/span&gt;) : &lt;span style="color:#a31515;"&gt;&amp;quot;Mr.&amp;quot;&lt;/span&gt;) + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ e.Person.FirstName.Trim() +
            (e.Person.MiddleName == &lt;span style="color:blue;"&gt;null &lt;/span&gt;|| e.Person.MiddleName.Trim().Length == 0 ? &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ e.Person.MiddleName.Trim() + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot;&lt;/span&gt;) +
            e.Person.LastName.Trim();&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;and it will be executed as:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;SELECT
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[LoginID]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[NationalIDNumber]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[JobTitle]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MaritalStatus]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BirthDate]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Gender]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[HireDate]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[SalariedFlag]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[VacationHours]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[SickLeaveHours]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[CurrentFlag]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[rowguid]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ModifiedDate]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[BusinessEntityID2]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[PersonType]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[NameStyle]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Title]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[FirstName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MiddleName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[LastName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Suffix]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[EmailPromotion]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[AdditionalContactInfo]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Demographics]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[rowguid] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[rowguid2]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[ModifiedDate] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[ModifiedDate2]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;[HumanResources]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Employee] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t0]
&lt;span style="color:gray;"&gt;INNER JOIN &lt;/span&gt;[Person]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Person] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t1] &lt;span style="color:blue;"&gt;ON &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID] &lt;span style="color:gray;"&gt;= &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID]
&lt;span style="color:blue;"&gt;WHERE &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[SalariedFlag] &lt;span style="color:gray;"&gt;= &lt;/span&gt;1
&lt;span style="color:green;"&gt;-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4926&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;As you can notice, text operations are no longer done on the database, but all the columns of both tables are being returned. And this is still a bad thing because we are using network bandwidth with data that won’t be used.&lt;/p&gt;

&lt;p align="justify"&gt;The way to choose the columns that will be retrieved from the database is by selecting only the ones wanted in the select statement. But because we still want string operations the be done on the client, we’ll need to project the desired columns into an intermediary object. Since we won’t need this object outside the query, we’ll use an &lt;a title="Anonymous Types" href="http://msdn.microsoft.com/library/bb397696.aspx" target="_blank"&gt;anonymous type&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The query would now be written as:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;q3 = &lt;span style="color:blue;"&gt;from &lt;/span&gt;n &lt;span style="color:blue;"&gt;in
             &lt;/span&gt;(
                 &lt;span style="color:blue;"&gt;from &lt;/span&gt;e &lt;span style="color:blue;"&gt;in &lt;/span&gt;context.Employees
                 &lt;span style="color:blue;"&gt;where &lt;/span&gt;e.SalariedFlag
                 &lt;span style="color:blue;"&gt;select new
                 &lt;/span&gt;{
                     Gender = e.Gender,
                     MaritalStatus = e.MaritalStatus,
                     FirstName = e.Person.FirstName,
                     MiddleName = e.Person.MiddleName,
                     LastName = e.Person.LastName
                 }
             ).AsEnumerable()
         &lt;span style="color:blue;"&gt;select &lt;/span&gt;((n.Gender == &lt;span style="color:#a31515;"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;) ? ((n.MaritalStatus == &lt;span style="color:#a31515;"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;) ? &lt;span style="color:#a31515;"&gt;&amp;quot;Miss&amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot;Mrs.&amp;quot;&lt;/span&gt;) : &lt;span style="color:#a31515;"&gt;&amp;quot;Mr.&amp;quot;&lt;/span&gt;) + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ n.FirstName.Trim()
         + (n.MiddleName == &lt;span style="color:blue;"&gt;null &lt;/span&gt;|| n.MiddleName.Trim().Length == 0 ? &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ n.MiddleName.Trim() + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot;&lt;/span&gt;)
         + n.LastName.Trim();&lt;/pre&gt;

&lt;p&gt;and it will be executed as:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;SELECT
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Gender]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MaritalStatus]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[FirstName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MiddleName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[LastName]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;[HumanResources]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Employee] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t0]
&lt;span style="color:gray;"&gt;INNER JOIN &lt;/span&gt;[Person]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Person] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t1] &lt;span style="color:blue;"&gt;ON &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID] &lt;span style="color:gray;"&gt;= &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID]
&lt;span style="color:blue;"&gt;WHERE &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[SalariedFlag] &lt;span style="color:gray;"&gt;= &lt;/span&gt;1
&lt;span style="color:green;"&gt;-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4926&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Notice the call to Enumerable.As Enumerable to translate the LINQ To SQL query into a LINQ To Objects query.&lt;/p&gt;

&lt;p&gt;And, to end this long blog post, if you don’t use any string operations on the query, they, obviously, won’t be translated to T-SQL:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;var &lt;/span&gt;q4 = &lt;span style="color:blue;"&gt;from &lt;/span&gt;e &lt;span style="color:blue;"&gt;in &lt;/span&gt;context.Employees
         &lt;span style="color:blue;"&gt;where &lt;/span&gt;e.SalariedFlag
         &lt;span style="color:blue;"&gt;select &lt;/span&gt;BuildSalutation(e.Gender, e.MaritalStatus, e.Person.FirstName, e.Person.MiddleName, e.Person.LastName);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;where &lt;strong&gt;BuildSalutation&lt;/strong&gt; is implemented as:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;private static object &lt;/span&gt;BuildSalutation(&lt;span style="color:blue;"&gt;char &lt;/span&gt;gender, &lt;span style="color:blue;"&gt;char &lt;/span&gt;maritalStatus, &lt;span style="color:blue;"&gt;string &lt;/span&gt;firstName, &lt;span style="color:blue;"&gt;string &lt;/span&gt;middleName, &lt;span style="color:blue;"&gt;string &lt;/span&gt;lastName)
{
    &lt;span style="color:blue;"&gt;return &lt;/span&gt;((gender == &lt;span style="color:#a31515;"&gt;&amp;#39;F&amp;#39;&lt;/span&gt;) ? ((maritalStatus == &lt;span style="color:#a31515;"&gt;&amp;#39;S&amp;#39;&lt;/span&gt;) ? &lt;span style="color:#a31515;"&gt;&amp;quot;Miss&amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot;Mrs.&amp;quot;&lt;/span&gt;) : &lt;span style="color:#a31515;"&gt;&amp;quot;Mr.&amp;quot;&lt;/span&gt;) + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot;
        &lt;/span&gt;+ firstName.Trim()
        + (middleName == &lt;span style="color:blue;"&gt;null &lt;/span&gt;|| middleName.Trim().Length == 0 ? &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;: &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ middleName.Trim() + &lt;span style="color:#a31515;"&gt;&amp;quot; &amp;quot;&lt;/span&gt;)
        + lastName.Trim();
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;and it will be executed as:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;SELECT
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Gender] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[gender]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MaritalStatus] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[maritalStatus]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[FirstName] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[firstName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[MiddleName] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[middleName]&lt;span style="color:gray;"&gt;,
    &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[LastName] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[lastName]
&lt;span style="color:blue;"&gt;FROM &lt;/span&gt;[HumanResources]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Employee] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t0]
&lt;span style="color:gray;"&gt;INNER JOIN &lt;/span&gt;[Person]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[Person] &lt;span style="color:blue;"&gt;AS &lt;/span&gt;[t1] &lt;span style="color:blue;"&gt;ON &lt;/span&gt;[t1]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID] &lt;span style="color:gray;"&gt;= &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[BusinessEntityID]
&lt;span style="color:blue;"&gt;WHERE &lt;/span&gt;[t0]&lt;span style="color:gray;"&gt;.&lt;/span&gt;[SalariedFlag] &lt;span style="color:gray;"&gt;= &lt;/span&gt;1
&lt;span style="color:green;"&gt;-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.4926&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;Have you noticed that this T-SQL query is pretty much the same in the previous example?&lt;/p&gt;

&lt;p&gt;If you are still reading this, I hope you now aware of how you write your LINQ To SQL queries affect the generated T-SQL.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1732069" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TipsAndTricks/default.aspx">TipsAndTricks</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ2SQL/default.aspx">LINQ2SQL</category></item><item><title>PowerShell For The .NET Developer</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/09/18/powershell-for-the-net-developer.aspx</link><pubDate>Fri, 18 Sep 2009 00:03:12 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1724580</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1724580</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1724580</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/09/18/powershell-for-the-net-developer.aspx#comments</comments><description>&lt;p align="justify"&gt;Some time ago I needed to have the &lt;strong&gt;validationKey&lt;/strong&gt; of the &lt;a title="machineKey Element (ASP.NET Settings Schema)" href="http://msdn.microsoft.com/library/w8h3skw9.aspx" target="_blank"&gt;machineKey element&lt;/a&gt; of an &lt;a title="ASP.NET Developer Center" href="http://msdn.microsoft.com/asp.net/" target="_blank"&gt;ASP.NET&lt;/a&gt; application changed and found out that ASP.NET doesn’t provide a command-line tool (or any other) to do this.&lt;/p&gt;  &lt;p align="justify"&gt;Looking around I found several applications and code samples to do it, but to have a system administrator do this I needed to test and document the application and it was to much work for such task.&lt;/p&gt;  &lt;p align="justify"&gt;I’ve always been a supporter of the idea of &lt;a title="Windows PowerShell" href="http://www.microsoft.com/powershell" target="_blank"&gt;PowerShell&lt;/a&gt; but I never used it my self. Just because I almost always have &lt;a title="Microsoft Visual Studio" href="http://cli.gs/vstudio" target="_blank"&gt;Visual Studio&lt;/a&gt; open and writing a simple console application is quicker and easier than learning PowerShell.&lt;/p&gt;  &lt;p align="justify"&gt;This time I decide that I would do a PowerShell script instead.&lt;/p&gt;  &lt;p align="justify"&gt;In &lt;a title="Microsoft Visual C#" href="http://cli.gs/vcsharp" target="_blank"&gt;C#&lt;/a&gt; I would have done something like this:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Program
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;private static string &lt;/span&gt;GenerateKey()
    {
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;buff = &lt;span style="color:blue;"&gt;new byte&lt;/span&gt;[64];
        (&lt;span style="color:blue;"&gt;new &lt;/span&gt;System.Security.Cryptography.&lt;span style="color:#2b91af;"&gt;RNGCryptoServiceProvider&lt;/span&gt;()).GetBytes(buff);
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;sb = &lt;span style="color:blue;"&gt;new &lt;/span&gt;System.Text.&lt;span style="color:#2b91af;"&gt;StringBuilder&lt;/span&gt;();
        &lt;span style="color:blue;"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue;"&gt;var &lt;/span&gt;b &lt;span style="color:blue;"&gt;in &lt;/span&gt;buff)
        {
            sb.AppendFormat(&lt;span style="color:#a31515;"&gt;&amp;quot;{0:X2}&amp;quot;&lt;/span&gt;, b);
        }
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;sb.ToString();
    }

    &lt;span style="color:blue;"&gt;private static void &lt;/span&gt;Main(&lt;span style="color:blue;"&gt;string&lt;/span&gt;[] args)
    {
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;path = args[0];
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;config = System.Web.Configuration.&lt;span style="color:#2b91af;"&gt;WebConfigurationManager&lt;/span&gt;.OpenMachineConfiguration(path);
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;systemWeb = config.GetSectionGroup(&lt;span style="color:#a31515;"&gt;&amp;quot;system.web&amp;quot;&lt;/span&gt;) &lt;span style="color:blue;"&gt;as &lt;/span&gt;System.Web.Configuration.&lt;span style="color:#2b91af;"&gt;SystemWebSectionGroup&lt;/span&gt;;
        &lt;span style="color:blue;"&gt;var &lt;/span&gt;machineKey = systemWeb.MachineKey;
        machineKey.ValidationKey = GenerateKey();
        config.Save(System.Configuration.&lt;span style="color:#2b91af;"&gt;ConfigurationSaveMode&lt;/span&gt;.Modified);
    }
}&lt;/pre&gt;

&lt;p align="justify"&gt;How would it be in PowerShell? As simple as this:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;function GenerateKey
&lt;/span&gt;&lt;span style="color:black;"&gt;{
    [&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;System.Byte&lt;/span&gt;&lt;span style="color:black;"&gt;[]]&lt;/span&gt;&lt;span style="color:purple;"&gt;$buff &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:black;"&gt;0..63
    (&lt;/span&gt;&lt;span style="color:#5f9ea0;"&gt;new-object &lt;/span&gt;&lt;span style="color:#8b4513;"&gt;System.Security.Cryptography.RNGCryptoServiceProvider&lt;/span&gt;&lt;span style="color:black;"&gt;).&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;GetBytes&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:purple;"&gt;$buff&lt;/span&gt;&lt;span style="color:black;"&gt;)
    &lt;/span&gt;&lt;span style="color:purple;"&gt;$sb &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:#5f9ea0;"&gt;new-object &lt;/span&gt;&lt;span style="color:#8b4513;"&gt;System.Text.StringBuilder&lt;/span&gt;&lt;span style="color:black;"&gt;(128)
    &lt;/span&gt;&lt;span style="color:blue;"&gt;for&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:purple;"&gt;$i &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:black;"&gt;0&lt;/span&gt;&lt;span style="color:blue;"&gt;; &lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:purple;"&gt;$i &lt;/span&gt;&lt;span style="color:red;"&gt;-lt &lt;/span&gt;&lt;span style="color:purple;"&gt;$buff&lt;/span&gt;&lt;span style="color:black;"&gt;.&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;Length&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;span style="color:blue;"&gt;; &lt;/span&gt;&lt;span style="color:purple;"&gt;$i&lt;/span&gt;&lt;span style="color:red;"&gt;++&lt;/span&gt;&lt;span style="color:black;"&gt;)
    {
        &lt;/span&gt;&lt;span style="color:purple;"&gt;$sb &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:purple;"&gt;$sb&lt;/span&gt;&lt;span style="color:black;"&gt;.&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;AppendFormat&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;&amp;quot;{0:X2}&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;, &lt;/span&gt;&lt;span style="color:purple;"&gt;$buff&lt;/span&gt;&lt;span style="color:black;"&gt;[&lt;/span&gt;&lt;span style="color:purple;"&gt;$i&lt;/span&gt;&lt;span style="color:black;"&gt;])
    }
    &lt;/span&gt;&lt;span style="color:blue;"&gt;return &lt;/span&gt;&lt;span style="color:purple;"&gt;$sb&lt;/span&gt;&lt;span style="color:black;"&gt;.&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;ToString&lt;/span&gt;&lt;span style="color:black;"&gt;()
}

[&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;System.Reflection.Assembly&lt;/span&gt;&lt;span style="color:black;"&gt;]::&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;LoadWithPartialName&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;&amp;quot;System.Web&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;)
&lt;/span&gt;&lt;span style="color:purple;"&gt;$config &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:black;"&gt;[&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;System.Web.Configuration.WebConfigurationManager&lt;/span&gt;&lt;span style="color:black;"&gt;]::&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;OpenWebConfiguration&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;&amp;quot;&lt;em&gt;&amp;lt;path&amp;gt;&lt;/em&gt;&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;)
&lt;/span&gt;&lt;span style="color:purple;"&gt;$systemWeb &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:purple;"&gt;$config&lt;/span&gt;&lt;span style="color:black;"&gt;.&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;GetSectionGroup&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;&amp;quot;system.web&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;span style="color:blue;"&gt;;
&lt;/span&gt;&lt;span style="color:purple;"&gt;$machineKey &lt;/span&gt;&lt;span style="color:red;"&gt;= &lt;/span&gt;&lt;span style="color:purple;"&gt;$systemWeb&lt;/span&gt;&lt;span style="color:black;"&gt;.&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;MachineKey
&lt;/span&gt;&lt;span style="color:purple;"&gt;$machineKey&lt;/span&gt;&lt;span style="color:black;"&gt;.&lt;/span&gt;&lt;span style="color:blue;"&gt;ValidationKey&lt;/span&gt;&lt;span style="color:red;"&gt;=&lt;/span&gt;&lt;span style="color:blue;"&gt;GenerateKey
&lt;/span&gt;&lt;span style="color:purple;"&gt;$config&lt;/span&gt;&lt;span style="color:black;"&gt;.&lt;/span&gt;&lt;span style="color:#8b4513;"&gt;save&lt;/span&gt;&lt;span style="color:black;"&gt;(&lt;/span&gt;&lt;span style="color:maroon;"&gt;&amp;quot;Modified&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;)&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Wonder how I got from no knowledge of PowerShell to this? Simple. Something that every real &lt;a title="Microsoft .NET Framework" href="https://www.microsoft.com/net/" target="_blank"&gt;.NET&lt;/a&gt; developer has and loves: &lt;a title=".NET Reflector" href="http://www.red-gate.com/products/reflector/" target="_blank"&gt;.NET Reflector&lt;/a&gt; (with a &lt;a title="PowerShellLanguage" href="http://reflectoraddins.codeplex.com/Wiki/View.aspx?title=PowerShellLanguage" target="_blank"&gt;PowerShell add-in&lt;/a&gt;, of course).&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1724580" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Reflector/default.aspx">Reflector</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/PowerShell/default.aspx">PowerShell</category></item><item><title>LINQ With C# Book Is Finally Out</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/05/18/linq-with-c-book-is-finally-out.aspx</link><pubDate>Sun, 17 May 2009 23:39:51 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1692586</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1692586</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1692586</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/05/18/linq-with-c-book-is-finally-out.aspx#comments</comments><description>&lt;p align="justify"&gt;It’s finally out!&lt;/p&gt;  &lt;p align="justify"&gt;The &lt;strong&gt;&lt;a title="Livro LINQ Com C#" href="http://cli.gs/Livro-LINQ-Com-Charp" target="_blank"&gt;LINQ Com C#&lt;/a&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt; (LINQ With C#) book that &lt;a title="Luís Abreu" href="http://cli.gs/LuisAbreu" target="_blank"&gt;Luís&lt;/a&gt; and I wrote is out. Well, mostly Luís than I.&lt;/p&gt;  &lt;p align="justify"&gt;This book, published by &lt;a title="FCA- Livros de Informática / TI para todos os níveis" href="http://www.fca.pt/" target="_blank"&gt;FCA&lt;/a&gt;, is targeted at anyone that already knows &lt;a title="Microsoft Visual C#" href="http://cli.gs/vcsharp" target="_blank"&gt;C#&lt;/a&gt; 2.0 and wants to know learn the new features introduced with C# 3.0 that made possible &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn2.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt; (Language INtegrated Query). The examples in the book are written in C#, but &lt;a title="Visual Basic Developer Center" href="http://msdn.microsoft.com/vbasic/" target="_blank"&gt;Visual Basic&lt;/a&gt; get be get from the book’s site.&lt;/p&gt;  &lt;div&gt;   &lt;table&gt;       &lt;tr&gt;         &lt;td style="padding-right:10px;" rowspan="5"&gt;&lt;a title="Livro LINQ Com C#" href="http://cli.gs/Livro-LINQ-Com-Charp" target="_blank"&gt;&lt;img border="0" alt="Livro LINQ Com C#" src="http://www.fca.pt/ximages/722_547.gif" /&gt;&lt;/a&gt;&lt;/td&gt;          &lt;td style="text-align:right;padding-right:10px;"&gt;Title:&lt;/td&gt;          &lt;td&gt;&lt;strong&gt;&lt;a title="Livro LINQ Com C#" href="http://cli.gs/Livro-LINQ-Com-Charp" target="_blank"&gt;LINQ Com C#&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td style="text-align:right;padding-right:10px;"&gt;Authors:&lt;/td&gt;          &lt;td&gt;&lt;a title="Luís Abreu" href="http://cli.gs/LuisAbreu" target="_blank"&gt;Luís Abreu&lt;/a&gt; / &lt;a title="Paulo Morgado" href="http://paulomorgado.net/" target="_blank"&gt;Paulo Morgado&lt;/a&gt;&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td style="text-align:right;padding-right:10px;"&gt;ISBN:&lt;/td&gt;          &lt;td&gt;978-972-722-547-7&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td style="text-align:right;padding-right:10px;"&gt;Number of Pages:&lt;/td&gt;          &lt;td&gt;216&lt;/td&gt;       &lt;/tr&gt;        &lt;tr&gt;         &lt;td style="text-align:right;padding-right:10px;"&gt;Format:&lt;/td&gt;          &lt;td&gt;17,0 x 24,0 x 1,3 cm (6.7 x 9.4 x 0.5 in)&lt;/td&gt;       &lt;/tr&gt;     &lt;/table&gt; &lt;/div&gt;  &lt;p&gt;The book can be found here:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://cli.gs/Livro-LINQ-Com-Charp"&gt;FCA&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://cli.gs/LYJEVY"&gt;WOOK&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://cli.gs/8ApGrH"&gt;fnac&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1692586" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualBasic/default.aspx">VisualBasic</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Books/default.aspx">Books</category></item><item><title>Help Typemock Launch Its New Visual Basic .NET Friendly API And You Might Get A Free License</title><link>http://msmvps.com/blogs/paulomorgado/archive/2009/01/13/help-typemock-launch-its-new-visual-basic-net-friendly-api-and-you-might-get-a-free-license.aspx</link><pubDate>Tue, 13 Jan 2009 21:32:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1661503</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1661503</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1661503</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2009/01/13/help-typemock-launch-its-new-visual-basic-net-friendly-api-and-you-might-get-a-free-license.aspx#comments</comments><description>&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;&lt;a title="Typemock - Simplify Unit Testing!" href="http://cli.gs/Typemock" target="_blank"&gt;Typemock&lt;/a&gt; is announcing today a new version of Typemock Isolator (5.2).&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;One of the coolest features in the new version is the inclusion of a new &lt;a title="Unit Testing VB.NET" href="http://cli.gs/1DbBzH"&gt;VB .NET unit testing API&lt;/a&gt;. This &amp;#39;VB friendly&amp;#39; API was designed and written in VB.NET, for VB.NET developers. It uses the strengths of the VB.NET language to allow easy and intuitive use of the isolation API, for easier unit tests on any piece of .NET code.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;If you are you a blogger, webmaster, or internet columnist, you can get your free personal license by helping Typemock launch their new 5.2 version for Isolator - the best tool to unit test VB.NET applications.&lt;/p&gt;
&lt;p align="justify"&gt;Although this version is targeted to unit test VB.NET applications, &lt;a title="Visual C#" href="http://cli.gs/vcsharp" target="_blank"&gt;C#&lt;/a&gt; applications with unit tests built using &lt;a title="Microsoft Visual Studio" href="http://cli.gs/vstudio" target="_blank"&gt;Visual Studio&lt;/a&gt; 2005 can also benefit from this API.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;&lt;strong&gt;How can you get the free license?&lt;/strong&gt;&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;Post the text below on your blog (as is, with links) and &lt;a href="mailto:vb@typemock.com" target="_blank"&gt;tell them about it&lt;/a&gt; . If you are in the first 25 to mail them after posting, your license will be on its way!&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;If you have a &lt;strong&gt;VB.NET dedicated blog&lt;/strong&gt;, you&amp;#39;ll get a license automatically (even if more than 25 submit) during the first week of this announcement.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;A few simple requirements:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;div align="justify"&gt;You must own a website, blog space or internet column, older than 2 months, or get permission from the owner of such a site. &lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Your post must include the text below (including the links) between &lt;strong&gt;*Begin*&lt;/strong&gt; and &lt;strong&gt;*End*&lt;/strong&gt;. &lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;_&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;&lt;strong&gt;*Begin*&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.typemock.com/vbpage.php?utm_source=vbp&amp;amp;utm_medium=typeblog&amp;amp;utm_campaign=isolatorvb"&gt;Programming Visual Basic&lt;/a&gt; applications?&lt;/p&gt;
&lt;p&gt;Typemock have released a new version of their &lt;a href="http://www.typemock.com/?utm_source=hp&amp;amp;utm_medium=typeblog&amp;amp;utm_campaign=isolatorvb"&gt;unit testing&lt;/a&gt; tool, Typemock Isolator 5.2. &lt;br /&gt;This version includes a new friendly &lt;a href="http://www.typemock.com/vbpage.php?utm_source=vbp&amp;amp;utm_medium=typeblog&amp;amp;utm_campaign=isolatorvb"&gt;VB.NET&lt;/a&gt; API which makes Isolator the best Isolation tool for &lt;a href="http://www.typemock.com/vbpage.php?utm_source=vbp&amp;amp;utm_medium=typeblog&amp;amp;utm_campaign=isolatorvb"&gt;unit testing A Visual Basic (VB) .NET application&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Isolator now allows unit testing in VB or C# for many ‘hard to test’ technologies such as &lt;a href="http://typemock.com/sharepointpage.php?utm_source=spp&amp;amp;utm_medium=typeblog&amp;amp;utm_campaign=isolatorvb"&gt;SharePoint&lt;/a&gt;, ASP.NET MVC, partial support for Silverlight, WPF, LINQ, WF, Entity Framework, &lt;a href="http://www.typemock.com/wcfpage.php?utm_source=wcfp&amp;amp;utm_medium=typeblog&amp;amp;utm_campaign=isolatorvb"&gt;WCF unit testing&lt;/a&gt; and more.&lt;/p&gt;
&lt;p&gt;Note that the first 25 bloggers who blog this text in their blog and tell us about it, will get a &lt;strong&gt;Free Full Isolator license&lt;/strong&gt; (worth $139). If you post this in a &lt;strong&gt;VB.NET dedicated blog&lt;/strong&gt;, you&amp;#39;ll get a license automatically (even if more than 25 submit) during the first week of this announcement.&lt;/p&gt;
&lt;p&gt;Go ahead, click the following link for &lt;a href="http://blog.typemock.com/2009/01/get-free-isolator-licnese-for-helping.html?utm_source=vb_blog&amp;amp;utm_medium=typeblog&amp;amp;utm_campaign=isolatorvbblog"&gt;more information&lt;/a&gt; on how to get your free license.&lt;/p&gt;
&lt;p&gt;_&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;*End*&lt;/strong&gt;&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;Once you post this in your site, just drop them a line at &lt;a href="mailto:vb@typemock.com"&gt;vb@typemock.com&lt;/a&gt; with your name and the post URL to get your free license.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;Hurry up – this offer is limited to the first 25 general bloggers, or to VB.NET dedicated bloggers who will post this in the first week.&lt;/p&gt;
&lt;p align="justify"&gt;--&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; This is an offer from &lt;a title="Typemock - Simplify Unit Testing!" href="http://www.typemock.com/" target="_blank"&gt;Typemock&lt;/a&gt; as announced at &lt;a title="http://blog.typemock.com/2009/01/get-free-isolator-licnese-for-helping.html" href="http://blog.typemock.com/2009/01/get-free-isolator-licnese-for-helping.html"&gt;http://blog.typemock.com/2009/01/get-free-isolator-licnese-for-helping.html&lt;/a&gt;. I’m just a fan.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1661503" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Tools/default.aspx">Tools</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Testing/default.aspx">Testing</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/UnitTests/default.aspx">UnitTests</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TypeMock/default.aspx">TypeMock</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualBasic/default.aspx">VisualBasic</category></item><item><title>The Future Of C#</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/12/03/the-future-of-c.aspx</link><pubDate>Wed, 03 Dec 2008 01:17:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1655592</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1655592</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1655592</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/12/03/the-future-of-c.aspx#comments</comments><description>&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;If you were able to attend this session at &lt;a title="Microsoft PDC" target="_blank" href="http://microsoftpdc.com/"&gt;PDC&lt;/a&gt; or &lt;a title="Tech-Ed EMEA Developers 2008" target="_blank" href="http://www.microsoft.com/emea/teched2008/developer/"&gt;Tech-Ed EMEA Developers&lt;/a&gt;, you were presented with a first class presentation of the future of &lt;a title="Visual C#" target="_blank" href="http://msdn.microsoft.com/vcsharp/"&gt;C#&lt;/a&gt;, presented, respectively, by Anders Hejlsberg and &lt;a title="The Mellow Musings of Dr. T" target="_blank" href="http://blogs.msdn.com/madst/"&gt;Mads Torgersen&lt;/a&gt;.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;For the near future (&lt;a title=".NET Framework Developer Center" target="_blank" href="http://msdn.microsoft.com/netframework/"&gt;.NET&lt;/a&gt; 4.0) C# will have:&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Dynamically Typed Objects&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Optional and Named Parameters&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Improved COM Interoperability&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;Co- and Contra-variance&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;A preview of the compiler as a service was shown, but that’s not for the .NET 4.0 / Visual Studio 2010 timeframe. Probably, not even for the next.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;Starting with .NET 4.0, C# and &lt;a title="Visual Basic Developer Center" target="_blank" href="http://msdn.microsoft.com/vbasic/"&gt;Visual Basic&lt;/a&gt; will converge in terms of features and follow a path of co-evolution going into the future.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;No! That doesn’t mean that XML literals will be in C# in a foreseeable future. What that means is that the above list also applies to Visual Basic.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p align="justify"&gt;Talking of Visual Basic evolution, the &lt;strong&gt;_&lt;/strong&gt; line continuation character has been retired. If you have any use for the underscore, please visit &lt;a title="http://www.unemployedunderscores.com/" href="http://www.unemployedunderscores.com/"&gt;http://www.unemployedunderscores.com/&lt;/a&gt;.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;h4&gt;Resources:&lt;/h4&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a title="C# Future" target="_blank" href="http://code.msdn.microsoft.com/csharpfuture"&gt;C# Future&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a title="Microsoft Pre-release Software Visual Studio 2010 and .NET Framework 4.0 Community Technology Preview (CTP)" target="_blank" href="https://www.microsoft.com/downloads/details.aspx?FamilyId=922B4655-93D0-4476-BDA4-94CF5F8D4814"&gt;Microsoft Pre-release Software Visual Studio 2010 and .NET Framework 4.0 Community Technology Preview (CTP)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="Charlie Calvert&amp;#39;s Community Blog" target="_blank" href="http://blogs.msdn.com/charlie/"&gt;Charlie Calvert&amp;#39;s Community Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;PDC Session: TL16 - The Future of C#&lt;/div&gt;
&lt;div align="justify"&gt;Presenter: Anders Hejlsberg &lt;/div&gt;
&lt;div align="justify"&gt;&lt;a href="http://mschnlnine.vo.llnwd.net/d1/pdc08/PPTX/TL16.pptx"&gt;PPTX&lt;/a&gt; | &lt;a href="http://mschnlnine.vo.llnwd.net/d1/pdc08/WMV-HQ/TL16.wmv"&gt;WMV-HQ&lt;/a&gt; | &lt;a href="http://mschnlnine.vo.llnwd.net/d1/pdc08/WMV/TL16.wmv"&gt;WMV&lt;/a&gt; | &lt;a href="http://mschnlnine.vo.llnwd.net/d1/pdc08/ZUNE/TL16.wmv"&gt;Zune&lt;/a&gt; | &lt;a href="http://mschnlnine.vo.llnwd.net/d1/pdc08/MP4/TL10.mp4"&gt;MP4&lt;/a&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div align="justify"&gt;PDC Session: &lt;a title="Future Directions for Microsoft Visual Basic" target="_blank" href="http://channel9.msdn.com/pdc2008/TL12/"&gt;TL12 - Future Directions for Microsoft Visual Basic&lt;/a&gt;&lt;/div&gt;
&lt;div align="justify"&gt;Presenter(s): Paul Vick, Lucian Wischik&lt;/div&gt;
&lt;div align="justify"&gt;&lt;a href="http://mschnlnine.vo.llnwd.net/d1/pdc08/PPTX/TL12.pptx"&gt;PPTX&lt;/a&gt; | &lt;a href="http://mschnlnine.vo.llnwd.net/d1/pdc08/WMV-HQ/TL12.wmv"&gt;WMV-HQ&lt;/a&gt; | &lt;a href="http://mschnlnine.vo.llnwd.net/d1/pdc08/WMV/TL12.wmv"&gt;WMV&lt;/a&gt; | &lt;a href="http://mschnlnine.vo.llnwd.net/d1/pdc08/ZUNE/TL12.wmv"&gt;Zune&lt;/a&gt; | &lt;a href="http://mschnlnine.vo.llnwd.net/d1/pdc08/MP4/TL10.mp4"&gt;MP4&lt;/a&gt; &lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1655592" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TechEd/default.aspx">TechEd</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/PDC/default.aspx">PDC</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TechEd2008/default.aspx">TechEd2008</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualBasic/default.aspx">VisualBasic</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/PDC2008/default.aspx">PDC2008</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualStudio2010/default.aspx">VisualStudio2010</category></item><item><title>MSDN Ramp Up Program</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/11/07/msdn-ramp-up-program.aspx</link><pubDate>Fri, 07 Nov 2008 00:53:35 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1653334</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1653334</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1653334</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/11/07/msdn-ramp-up-program.aspx#comments</comments><description>    &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;     &lt;p align="center"&gt;         &lt;a href="http://www.MyRampUp.com"&gt;             &lt;img title="" border="0" alt="MSDN Ramp Up Program" src="http://i.msdn.microsoft.com/bb352986.RampUp_logo.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;     &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;     &lt;p align="justify"&gt;         I just came across this: &lt;a title="MSDN Ramp Up Program" href="http://www.MyRampUp.com"&gt;             www.MyRampUp&lt;/a&gt;&lt;/p&gt;     &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;     &lt;p align="justify"&gt;         Ramp Up is a free, online, community-based program that can help users save time         in learning Microsoft technology.&lt;/p&gt;     &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;     &lt;p align="justify"&gt;         The easy-to-access content (provided by subject-matter gurus) is specifically tailored         to the Ramp Up program, and offered in a variety of forms (whitepaper, v-lab, codecast         and slidecast).&lt;/p&gt;     &lt;p align="center"&gt;         &lt;a href="http://www.MyRampUp.com"&gt;             &lt;img title="" border="0" alt="Program Guide" src="http://i.msdn.microsoft.com/bb352986.program_guide.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;     &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;     &lt;p align="justify"&gt;         The currently available routes are:&lt;/p&gt;     &lt;p align="center"&gt;         &lt;a href="http://msdn.microsoft.com/rampup/dd221355.aspx"&gt;             &lt;img title="SharePoint for Developers track - learn more" border="0" alt="SharePoint for Developers track - learn more" src="http://i.msdn.microsoft.com/bb352986.track_blue_out.jpg" /&gt;&lt;/a&gt; &lt;a href="http://PauloMorgado.NET/"&gt;                 &lt;/a&gt;     &lt;/p&gt;     &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;     &lt;p align="center"&gt;         &lt;a href="http://msdn.microsoft.com/rampup/cc562987.aspx"&gt;             &lt;img title="Visual Studio 2008 track - learn more" border="0" alt="Visual Studio 2008 track - learn more" src="http://i.msdn.microsoft.com/bb352986.track_yellow2_out.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;     &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;     &lt;p align="center"&gt;         &lt;a href="http://msdn.microsoft.com/rampup/bb421265.aspx"&gt;             &lt;img title="Aspiring Developer - learn more" border="0" alt="Aspiring Developer - learn more" src="http://i.msdn.microsoft.com/bb352986.track_green_out.jpg" /&gt;&lt;/a&gt;     &lt;/p&gt;     &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;     &lt;p align="center"&gt;         &lt;a href="http://msdn.microsoft.com/rampup/bb421266.aspx"&gt;             &lt;img title="Success with Java and C# - learn more" border="0" alt="Success with Java and C# - learn more" src="http://i.msdn.microsoft.com/bb352986.track_yellow_out.jpg" /&gt;&lt;/a&gt;     &lt;/p&gt;     &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;     &lt;p align="center"&gt;         &lt;a href="http://msdn.microsoft.com/rampup/bb421267.aspx"&gt;             &lt;img title="Next Level Visual Basic - learn more" border="0" alt="Next Level Visual Basic - learn more" src="http://i.msdn.microsoft.com/bb352986.track_orange_out.jpg" /&gt;&lt;/a&gt;     &lt;/p&gt;     &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;     &lt;p align="center"&gt;         &lt;a href="http://msdn.microsoft.com/rampup/bb421268.aspx"&gt;             &lt;img title="Next Level Microsoft.NET - learn more" border="0" alt="Next Level Microsoft.NET - learn more" src="http://i.msdn.microsoft.com/bb352986.track_purple_out.jpg" /&gt;&lt;/a&gt;     &lt;/p&gt;     &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;     &lt;p align="justify"&gt;         Currently, there are no assessments in the program, so it&amp;#39;s quicker than ever to         graduate and receive the reward (25% off on certification and 50% off on e-Learning         - only for graduates of Ramp Up).&lt;/p&gt;     &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1653334" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Community/default.aspx">Community</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Training/default.aspx">Training</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SharePoint/default.aspx">SharePoint</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualBasic/default.aspx">VisualBasic</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualStudio2008/default.aspx">VisualStudio2008</category></item><item><title>LINQ With C# Book</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/09/22/linq-with-c-book.aspx</link><pubDate>Sun, 21 Sep 2008 23:42:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1648475</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1648475</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1648475</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/09/22/linq-with-c-book.aspx#comments</comments><description>&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;&lt;a title="Luís Abreu" href="http://msmvps.com/blogs/luisabreu/" target="_blank"&gt;Luís&lt;/a&gt; just &lt;a title="Future projects: Portuguese C# book on LINQ" href="http://msmvps.com/blogs/luisabreu/archive/2008/09/21/future-projects-portuguese-c-book-on-linq.aspx" target="_blank"&gt;broke the news&lt;/a&gt; on our &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn2.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt; with &lt;a title="Visual C#" href="http://msdn.microsoft.com/vcsharp/" target="_blank"&gt;C#&lt;/a&gt; book.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;I was honored with the invitation from Luís to write this book with him for &lt;a title="FCA- Livros de Informática / TI para todos os níveis" href="http://www.fca.pt/" target="_blank"&gt;FCA&lt;/a&gt;, for which he has already published a few books [&lt;a title="ASP.NET 2.0 - Curso Completo" href="http://www.fca.pt/cgi-bin/fca_main.cgi/?op=2&amp;amp;isbn=972-722-503-9" target="_blank"&gt;^&lt;/a&gt;] [&lt;a title="Ajax com ASP.Net Curso Completo" href="http://www.fca.pt/cgi-bin/fca_main.cgi/?op=2&amp;amp;isbn=978-972-722-551-4" target="_blank"&gt;^&lt;/a&gt;] [&lt;a title="ASP.NET 3.5 - Curso Completo" href="http://www.fca.pt/cgi-bin/fca_main.cgi/?op=2&amp;amp;isbn=978-972-722-615-3" target="_blank"&gt;^&lt;/a&gt;] before. &lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;This will be an entry level book in Portuguese targeted to anyone wanting to learn LINQ with C#.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;It has been a fun project with great discussions (only possible because we have half an ocean between us :) ).&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1648475" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Books/default.aspx">Books</category></item><item><title>PDC2008: Meet Me In Los Angeles</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/09/04/pdc2008-meet-me-in-los-angeles.aspx</link><pubDate>Thu, 04 Sep 2008 00:23:28 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1646687</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1646687</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1646687</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/09/04/pdc2008-meet-me-in-los-angeles.aspx#comments</comments><description>&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="center"&gt;&lt;a title="Microsoft PDC" href="http://microsoftpdc.com/" target="_blank"&gt;&lt;img src="http://microsoftpdc.com/Images/Wallpapers/frenetic_multi_thumb.jpg" alt="" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;It’s not the first time I try but, for one reason or another, this is the first time I will go to the &lt;a title="Microsoft PDC" href="http://microsoftpdc.com/" target="_blank"&gt;PDC&lt;/a&gt; (&lt;a title="Microsoft Corporation" href="http://www.microsoft.com/" target="_blank"&gt;Microsoft&lt;/a&gt;’s Professional Developers Conference).&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;According to the site “The PDC is designed for leading-edge developers and software architects. If you’re interested in the future of the Microsoft platform, you’re responsible for the technical strategy in your organization, or you’re a highly skilled developer who likes to delve deep into the heart of the platform, then the PDC is for you!”. If you fit this description, hurry up and register. Early bird discount has been extended until September 8&lt;sup&gt;th&lt;/sup&gt;.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;What I like most of these events is networking with Microsoft staff and other attendees. So, if you want to meet me, I’ll be glad to meet you.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1646687" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Events/default.aspx">Events</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/PDC/default.aspx">PDC</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/PDC2008/default.aspx">PDC2008</category></item><item><title>Clone Detective For Visual Studio</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/08/28/clone-detective-for-visual-studio.aspx</link><pubDate>Thu, 28 Aug 2008 22:41:36 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1646133</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1646133</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1646133</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/08/28/clone-detective-for-visual-studio.aspx#comments</comments><description>&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="center"&gt;&lt;a title="Clone Detective for Visual Studio" href="http://www.codeplex.com/CloneDetectiveVS" target="_blank"&gt;&lt;img title="Clone Detective for Visual Studio" alt="Clone Detective for Visual Studio" src="http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=CloneDetectiveVS&amp;amp;DownloadId=41494" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;&lt;a title="Clone Detective for Visual Studio" href="http://www.codeplex.com/CloneDetectiveVS" target="_blank"&gt;Clone Detective&lt;/a&gt; is a tool that integrates with &lt;a title="Microsoft Visual Studio" href="http://msdn.microsoft.com/vstudio/" target="_blank"&gt;Visual Studio&lt;/a&gt; and uses the &lt;a title="ConQAT (Continuous Quality Assessment Toolkit)" href="http://conqat.cs.tum.edu/" target="_blank"&gt;ConQAT&lt;/a&gt; (&lt;strong&gt;Con&lt;/strong&gt;tinuous &lt;strong&gt;Q&lt;/strong&gt;uality &lt;strong&gt;A&lt;/strong&gt;ssessment &lt;strong&gt;T&lt;/strong&gt;oolkit) to analyze &lt;a title="Visual C#" href="http://msdn.microsoft.com/vcsharp/" target="_blank"&gt;C#&lt;/a&gt; projects and search for duplicated source code.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p align="justify"&gt;Watch the &lt;a title="Clone Detective Videos" href="http://www.codeplex.com/CloneDetectiveVS/Wiki/View.aspx?title=Videos" target="_blank"&gt;videos&lt;/a&gt; and see if this is the tool you were looking for.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1646133" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Tools/default.aspx">Tools</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodePlex/default.aspx">CodePlex</category></item><item><title>StyleCop 4.3 Is Out</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/08/21/stylecop-4-3-is-out.aspx</link><pubDate>Wed, 20 Aug 2008 23:36:21 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1645290</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1645290</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1645290</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/08/21/stylecop-4-3-is-out.aspx#comments</comments><description>&lt;a&gt;&lt;/a&gt;  &lt;p&gt;The &lt;a title="Microsoft StyleCop" href="http://blogs.msdn.com/sourceanalysis/" target="_blank"&gt;StyleCop team&lt;/a&gt; &lt;a title="StyleCop 4.3 Is Released" href="http://blogs.msdn.com/sourceanalysis/archive/2008/08/19/stylecop-4-3-is-released.aspx" target="_blank"&gt;announced&lt;/a&gt; the release of a version 4.3 of the &lt;a title="Microsoft StyleCop" href="http://code.msdn.microsoft.com/sourceanalysis" target="_blank"&gt;StyleCop tool&lt;/a&gt;. You can get it from &lt;a title="StyleCop 4.3" href="http://code.msdn.microsoft.com/Release/ProjectReleases.aspx?ProjectName=sourceanalysis&amp;amp;ReleaseId=1425" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt; &lt;a&gt;&lt;/a&gt;  &lt;p&gt;On this version there are some bug fixes, new rules and documentation.&lt;/p&gt; &lt;a&gt;&lt;/a&gt;  &lt;p&gt;Also in this version, the list of errors and warnings goes to the &lt;strong&gt;Errors List&lt;/strong&gt; window like with the compilers. I whish that the errors and warnings would also be sent to the &lt;strong&gt;Output&lt;/strong&gt; window.&lt;/p&gt; &lt;a&gt;&lt;/a&gt;  &lt;p&gt;SDK documentation on how to author custom rules and integrate the tool with custom build environments is expected soon.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1645290" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Tools/default.aspx">Tools</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodingConventions/default.aspx">CodingConventions</category></item><item><title>More On Another Way For Using The “using” Keyword</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/08/11/more-on-another-way-for-using-the-using-keyword.aspx</link><pubDate>Mon, 11 Aug 2008 00:47:50 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1644170</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1644170</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1644170</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/08/11/more-on-another-way-for-using-the-using-keyword.aspx#comments</comments><description>&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p&gt;In the &lt;a title="Yet Another Way for Using the &amp;quot;using&amp;quot; Keyword" href="http://msmvps.com/blogs/paulomorgado/archive/2007/03/25/yet-another-way-for-using-the-using-keyword.aspx" target="_blank"&gt;past&lt;/a&gt; I presented another possible use for the &lt;a title="using (C# Reference)" href="http://msdn2.microsoft.com/library/124e1a63-2a4b-4132-b269-3b6d8d3ef72d.aspx"&gt;using&lt;/a&gt; keyword: as hints on &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn2.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt;.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p&gt;I’ve been giving some thought about this lately and refined my proposal.&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;pre&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt; q = &lt;font color="#0000ff"&gt;from&lt;/font&gt; person &lt;font color="#0000ff"&gt;in&lt;/font&gt; personCollection &lt;font color="#0000ff"&gt;using&lt;/font&gt; &lt;font color="#2b91af"&gt;MyEnumerableExtensions&lt;/font&gt;
        &lt;font color="#0000ff"&gt;group&lt;/font&gt; person &lt;font color="#0000ff"&gt;by&lt;/font&gt; person.LastName &lt;font color="#0000ff"&gt;into&lt;/font&gt; g &lt;font color="#0000ff"&gt;using new&lt;/font&gt; &lt;font color="#2b91af"&gt;MyOtherComparer&lt;/font&gt;()
        &lt;font color="#0000ff"&gt;orderby&lt;/font&gt; g.Key &lt;font color="#0000ff"&gt;using new&lt;/font&gt; &lt;font color="#2b91af"&gt;MyComparer&lt;/font&gt;()
        &lt;font color="#0000ff"&gt;select&lt;/font&gt; person;&lt;/pre&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p&gt;The above query would be converted to:&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;pre&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt; q = &lt;font color="#2b91af"&gt;MyEnumerableExtensions&lt;/font&gt;.OrderBy&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#2b91af"&gt;Person&lt;/font&gt;&amp;gt;(
    &lt;font color="#2b91af"&gt;MyEnumerableExtensions&lt;/font&gt;.GroupBy&amp;lt;&lt;font color="#0000ff"&gt;string&lt;/font&gt;, &lt;font color="#2b91af"&gt;Person&lt;/font&gt;&amp;gt;(
        personCollection,
        person =&amp;gt; person.LastName,
        &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;MyComparer&lt;/font&gt;(),
    ),
    g =&amp;gt; g.Key,
    &lt;font color="#0000ff"&gt;mew&lt;/font&gt; &lt;font color="#2b91af"&gt;MyOtherComparer&lt;/font&gt;()
);&lt;/pre&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p&gt;What do you think of this?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1644170" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category></item><item><title>How About Property Assignment And Collection Adding Like Object And Collection Initializers In C#?</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/08/11/how-about-property-assignment-and-collection-adding-like-object-and-collection-initializers-in-c.aspx</link><pubDate>Sun, 10 Aug 2008 23:27:22 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1644165</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1644165</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1644165</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/08/11/how-about-property-assignment-and-collection-adding-like-object-and-collection-initializers-in-c.aspx#comments</comments><description>&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;p&gt;&lt;a title="Visual C# Developer Center" href="http://msdn.microsoft.com/vcsharp" target="_blank"&gt;C#&lt;/a&gt; 3.0 introduced &lt;a title="Object and Collection Initializers (C# Programming Guide)" href="http://msdn.microsoft.com/library/c58f3db5-d7d4-4651-bd2d-5a3a97357f61.aspx" target="_blank"&gt;object and collection initializers&lt;/a&gt;. It is now easier to initialize objects or collections:&lt;/p&gt; &lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;  &lt;pre class="code"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; person = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt; { FirstName = &lt;span style="color:#a31515;"&gt;&amp;quot;Paulo&amp;quot;&lt;/span&gt;, LastName = &lt;span style="color:#a31515;"&gt;&amp;quot;Morgado&amp;quot;&lt;/span&gt; };

&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; persons = &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;Person&lt;/span&gt;&amp;gt; {
    &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt; { FirstName = &lt;span style="color:#a31515;"&gt;&amp;quot;Paulo&amp;quot;&lt;/span&gt;, LastName = &lt;span style="color:#a31515;"&gt;&amp;quot;Morgado&amp;quot;&lt;/span&gt; },
    &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt; { FirstName = &lt;span style="color:#a31515;"&gt;&amp;quot;Luís&amp;quot;&lt;/span&gt;, LastName = &lt;span style="color:#a31515;"&gt;&amp;quot;Abreu&amp;quot;&lt;/span&gt; }
};

&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; personDirectory = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;string, &lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt;&amp;gt; {
    { &lt;span style="color:#a31515;"&gt;&amp;quot;Lisboa&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt; { FirstName = &lt;span style="color:#a31515;"&gt;&amp;quot;Paulo&amp;quot;&lt;/span&gt;, LastName = &lt;span style="color:#a31515;"&gt;&amp;quot;Morgado&amp;quot;&lt;/span&gt; } },
    { &lt;span style="color:#a31515;"&gt;&amp;quot;Funchal&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt; { FirstName = &lt;span style="color:#a31515;"&gt;&amp;quot;Luís&amp;quot;&lt;/span&gt;, LastName = &amp;quot;Abreu&amp;quot; } }
};&lt;/pre&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p&gt;Wouldn&amp;#39;t be nice to be able to do the same on already created objects and collections?&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p&gt;But, what would the syntax used be? Something like this?&lt;/p&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;pre class="code"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; person = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt;();
person = { FirstName = &lt;span style="color:#a31515;"&gt;&amp;quot;Paulo&amp;quot;&lt;/span&gt;, LastName = &lt;span style="color:#a31515;"&gt;&amp;quot;Morgado&amp;quot;&lt;/span&gt; };

&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; persons = &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;Person&lt;/span&gt;&amp;gt;();
persons += {
    &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt; { FirstName = &lt;span style="color:#a31515;"&gt;&amp;quot;Paulo&amp;quot;&lt;/span&gt;, LastName = &lt;span style="color:#a31515;"&gt;&amp;quot;Morgado&amp;quot;&lt;/span&gt; },
    &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt; { FirstName = &lt;span style="color:#a31515;"&gt;&amp;quot;Luís&amp;quot;&lt;/span&gt;, LastName = &lt;span style="color:#a31515;"&gt;&amp;quot;Abreu&amp;quot;&lt;/span&gt; }
};

&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; personDirectory = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;string, &lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt;&amp;gt;();
personDirectory += {
    { &lt;span style="color:#a31515;"&gt;&amp;quot;Lisboa&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt; { FirstName = &lt;span style="color:#a31515;"&gt;&amp;quot;Paulo&amp;quot;&lt;/span&gt;, LastName = &lt;span style="color:#a31515;"&gt;&amp;quot;Morgado&amp;quot;&lt;/span&gt; } },
    { &lt;span style="color:#a31515;"&gt;&amp;quot;Funchal&amp;quot;&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt; { FirstName = &lt;span style="color:#a31515;"&gt;&amp;quot;Luís&amp;quot;&lt;/span&gt;, LastName = &amp;quot;Abreu&amp;quot; } }
};&lt;/pre&gt;
&lt;a href="http://PauloMorgado.NET/"&gt;&lt;/a&gt;

&lt;p&gt;What do you think of this?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1644165" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category></item><item><title>C# And Visual Basic Generate Different Expression Trees</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/08/04/c-and-visual-basic-generate-different-expression-trees.aspx</link><pubDate>Mon, 04 Aug 2008 00:23:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1643213</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1643213</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1643213</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/08/04/c-and-visual-basic-generate-different-expression-trees.aspx#comments</comments><description>&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;(This was pointed out to me by &lt;a title="Frans Bouma&amp;#39;s blog" href="http://weblogs.asp.net/fbouma/" target="_blank"&gt;Frans Bouma&lt;/a&gt; and explained by &lt;a title="Jon Skeet&amp;#39;s Coding Blog" href="http://msmvps.com/blogs/jon.skeet/" target="_blank"&gt;Jon Skeet&lt;/a&gt;)&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;Imagine you have this set of classes:&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;public class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;A
&lt;/span&gt;{
    &lt;span style="COLOR:blue;"&gt;public virtual string &lt;/span&gt;P
    {
        &lt;span style="COLOR:blue;"&gt;get &lt;/span&gt;{ &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;&amp;quot;A&amp;quot;&lt;/span&gt;; }
    }
}

&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;&lt;span style="COLOR:blue;"&gt;public class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;B &lt;/span&gt;: &lt;span style="COLOR:#2b91af;"&gt;A
&lt;/span&gt;{
}

&lt;span style="COLOR:blue;"&gt;public class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;C &lt;/span&gt;: &lt;span style="COLOR:#2b91af;"&gt;B
&lt;/span&gt;{
    &lt;span style="COLOR:blue;"&gt;public override string &lt;/span&gt;P
    {
        &lt;span style="COLOR:blue;"&gt;get &lt;/span&gt;{ &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;&lt;span style="COLOR:#a31515;"&gt;&amp;quot;C&amp;quot;&lt;/span&gt;; }
    }
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;And this class:&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;public static class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Reporter
&lt;/span&gt;{
    &lt;span style="COLOR:blue;"&gt;public static void &lt;/span&gt;Report&amp;lt;T&amp;gt;(T target, &lt;span style="COLOR:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T, &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;&amp;gt;&amp;gt; expression)
    {
        &lt;span style="COLOR:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;Expression: {0}&amp;quot;&lt;/span&gt;, expression);
        &lt;span style="COLOR:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;\tDeclaring Type: {0}&amp;quot;&lt;/span&gt;, ((expression &lt;span style="COLOR:blue;"&gt;as &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;LambdaExpression&lt;/span&gt;).Body &lt;span style="COLOR:blue;"&gt;as &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;MemberExpression&lt;/span&gt;).Member.DeclaringType);
        &lt;span style="COLOR:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;\tInvocation Result: {0} for {1}&amp;quot;&lt;/span&gt;, expression.Compile().Invoke(target), target.GetType());
        &lt;span style="COLOR:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine();
    }
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;The above class writes to the console the lambda expression, the declaring type of the property and the value of the property for the target and the target’s type.&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;Now, let’s look at what happens when used from this &lt;strong&gt;C#&lt;/strong&gt; code:&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:#2b91af;"&gt;Reporter&lt;/span&gt;.Report(&lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;C&lt;/span&gt;(), (&lt;span style="COLOR:#2b91af;"&gt;A &lt;/span&gt;a) =&amp;gt; a.P);
&lt;span style="COLOR:#2b91af;"&gt;Reporter&lt;/span&gt;.Report(&lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;C&lt;/span&gt;(), (&lt;span style="COLOR:#2b91af;"&gt;B &lt;/span&gt;b) =&amp;gt; b.P);
&lt;span style="COLOR:#2b91af;"&gt;Reporter&lt;/span&gt;.Report(&lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;C&lt;/span&gt;(), (&lt;span style="COLOR:#2b91af;"&gt;C &lt;/span&gt;c) =&amp;gt; c.P);

&lt;span style="COLOR:#2b91af;"&gt;Reporter&lt;/span&gt;.Report(&lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;B&lt;/span&gt;(), (&lt;span style="COLOR:#2b91af;"&gt;A &lt;/span&gt;a) =&amp;gt; a.P);
&lt;span style="COLOR:#2b91af;"&gt;Reporter&lt;/span&gt;.Report(&lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;B&lt;/span&gt;(), (&lt;span style="COLOR:#2b91af;"&gt;B &lt;/span&gt;b) =&amp;gt; b.P);

&lt;span style="COLOR:#2b91af;"&gt;Reporter&lt;/span&gt;.Report(&lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;A&lt;/span&gt;(), (&lt;span style="COLOR:#2b91af;"&gt;A &lt;/span&gt;a) =&amp;gt; a.P);&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;The output will be:&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;&lt;pre class="code"&gt;Expression: a =&amp;gt; a.P
        Declaring Type: A
        Invocation Result: C for C

Expression: b =&amp;gt; b.P
        Declaring Type: A
        Invocation Result: C for C

Expression: c =&amp;gt; c.P
        Declaring Type: A
        Invocation Result: C for C

Expression: a =&amp;gt; a.P
        Declaring Type: A
        Invocation Result: A for B

Expression: b =&amp;gt; b.P
        Declaring Type: A
        Invocation Result: A for B

Expression: a =&amp;gt; a.P
        Declaring Type: A
        Invocation Result: A for A&lt;/pre&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;On the other hand, if used from the equivalent &lt;strong&gt;Visual Basic&lt;/strong&gt; code:&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;&lt;pre class="code"&gt;Reporter.Report(&lt;span style="COLOR:blue;"&gt;New &lt;/span&gt;C(), &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt;(a &lt;span style="COLOR:blue;"&gt;As &lt;/span&gt;A) a.P)
Reporter.Report(&lt;span style="COLOR:blue;"&gt;New &lt;/span&gt;C(), &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt;(b &lt;span style="COLOR:blue;"&gt;As &lt;/span&gt;B) b.P)
Reporter.Report(&lt;span style="COLOR:blue;"&gt;New &lt;/span&gt;C(), &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt;(c &lt;span style="COLOR:blue;"&gt;As &lt;/span&gt;C) c.P)

Reporter.Report(&lt;span style="COLOR:blue;"&gt;New &lt;/span&gt;B(), &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt;(a &lt;span style="COLOR:blue;"&gt;As &lt;/span&gt;A) a.P)
Reporter.Report(&lt;span style="COLOR:blue;"&gt;New &lt;/span&gt;B(), &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt;(b &lt;span style="COLOR:blue;"&gt;As &lt;/span&gt;B) b.P)

Reporter.Report(&lt;span style="COLOR:blue;"&gt;New &lt;/span&gt;A(), &lt;span style="COLOR:blue;"&gt;Function&lt;/span&gt;(a &lt;span style="COLOR:blue;"&gt;As &lt;/span&gt;A) a.P)&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;The output will be:&lt;/p&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;&lt;pre class="code"&gt;Expression: a =&amp;gt; a.P
        Declaring Type: A
        Invocation Result: C for C

Expression: b =&amp;gt; b.P
        Declaring Type: A
        Invocation Result: C for C

Expression: c =&amp;gt; c.P
        Declaring Type: C
        Invocation Result: C for C

Expression: a =&amp;gt; a.P
        Declaring Type: A
        Invocation Result: A for B

Expression: b =&amp;gt; b.P
        Declaring Type: A
        Invocation Result: A for B

Expression: a =&amp;gt; a.P
        Declaring Type: A
        Invocation Result: A for A&lt;/pre&gt;&lt;a href="http://paulomorgado.net/"&gt;&lt;/a&gt;
&lt;p&gt;Why the differences? It’s because of each language’s specification and compiler:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;C#&lt;/strong&gt; compiler will issue a virtual call to the virtual member in the class where it’s declared as virtual. &lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Visual Basic&lt;/strong&gt; compiler will issue a virtual call to the overriding member on the class that overrides it. &lt;/li&gt;&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1643213" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualBasic/default.aspx">VisualBasic</category></item><item><title>Microsoft Source Analysis for C# (aka StyleCop)</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/06/05/microsoft-source-analysis-for-c-aka-stylecop.aspx</link><pubDate>Wed, 04 Jun 2008 23:12:22 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1631418</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1631418</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1631418</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/06/05/microsoft-source-analysis-for-c-aka-stylecop.aspx#comments</comments><description>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;I’ve learned from a &lt;a title="Hugo Ribeiro" href="http://www.arquitecturadesoftware.org/blogs/hugoribeiro/default.aspx" target="_blank"&gt;fellow&lt;/a&gt; &lt;a title="Grupo de Arquitectura de Software Português" href="http://www.arquitecturadesoftware.org/" target="_blank"&gt;GASP&lt;/a&gt;er of the release of &lt;a title="Announcing the release of Microsoft Source Analysis for C#" href="http://blogs.msdn.com/sourceanalysis/archive/2008/05/23/announcing-the-release-of-microsoft-source-analysis.aspx" target="_blank"&gt;Microsoft Source Analysis for C# (aka StyleCop)&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;It’s still a work in progress but it’s already very useful.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1631418" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Tools/default.aspx">Tools</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/CodingConventions/default.aspx">CodingConventions</category></item><item><title>Stretching Type Inference</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/04/22/stretching-type-inference.aspx</link><pubDate>Tue, 22 Apr 2008 00:35:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1598814</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1598814</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1598814</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/04/22/stretching-type-inference.aspx#comments</comments><description>&lt;p&gt;&lt;u&gt;&lt;strong&gt;Note:&lt;/strong&gt; Code in &lt;em&gt;italics&lt;/em&gt; is not actual C# 3.0 syntax.&lt;/u&gt;&lt;/p&gt;
&lt;h4&gt;Local Variable Type Inference&lt;/h4&gt;
&lt;p&gt;&lt;a title="Visual C#" href="http://msdn2.microsoft.com/library/kx37x362.aspx" target="_blank"&gt;C# 3.0&lt;/a&gt; brought us local variable type inference mainly because of &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn2.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt;. The output of a query can vary from an &lt;a class="" href="http://msdn2.microsoft.com/library/6201cf3a-7201-f0c7-c36d-81905a027d15.aspx" target="_blank"&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/a&gt; or an &lt;a class="" href="http://msdn2.microsoft.com/library/6201cf3a-7201-f0c7-c36d-81905a027d15.aspx" target="_blank"&gt;IQueryable&amp;lt;T&amp;gt;&lt;/a&gt; to a single instance of T where T can even be a projection which means that its type is an anonymous type.&lt;/p&gt;
&lt;p&gt;Take the following query as an example:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;from &lt;/span&gt;p &lt;span style="COLOR:blue;"&gt;in &lt;/span&gt;persons
&lt;span style="COLOR:blue;"&gt;select new &lt;/span&gt;{ Name = p.FirstName + &lt;span style="COLOR:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ p.LastName, Age = p.Age };&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;If persons is an &lt;font face="Consolas"&gt;&lt;strong&gt;IEnumerable&amp;lt;Person&amp;gt;&lt;/strong&gt;&lt;/font&gt;, the output of the query will be an &lt;font face="Consolas"&gt;&lt;strong&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/strong&gt;&lt;/font&gt; where &lt;font face="Consolas"&gt;&lt;strong&gt;T&lt;/strong&gt;&lt;/font&gt; is an anonymous type.&lt;/p&gt;
&lt;p&gt;Now the question that arises is: How do I declare a variable to receive the output of the query?&lt;/p&gt;
&lt;p&gt;The solution was the introduction of the new &lt;a title="var (C# Reference)" href="http://msdn2.microsoft.com/library/0777850a-2691-4e3e-927f-0c850f5efe15.aspx" target="_blank"&gt;var keyword&lt;/a&gt; that instructs the compiler to determine the type of the output of the query. Now, all it takes to declare a variable to receive the output of the query is:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;var &lt;/span&gt;q =
    &lt;span style="COLOR:blue;"&gt;from &lt;/span&gt;p &lt;span style="COLOR:blue;"&gt;in &lt;/span&gt;persons
    &lt;span style="COLOR:blue;"&gt;select new &lt;/span&gt;{ Name = p.FirstName + &lt;span style="COLOR:#a31515;"&gt;&amp;quot; &amp;quot; &lt;/span&gt;+ p.LastName, Age = p.Age };&lt;/pre&gt;
&lt;p&gt;Since the compiler can infer the type of something that looks so complex, it&amp;#39;s obvious that it can infer the type of something so straightforward as:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;var &lt;/span&gt;v = &lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Point&lt;/span&gt;, &lt;span style="COLOR:#2b91af;"&gt;Stack&lt;/span&gt;&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Person&lt;/span&gt;&amp;gt;&amp;gt;();&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;It&amp;#39;s obvious that this is the same as:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Point&lt;/span&gt;, &lt;span style="COLOR:#2b91af;"&gt;Stack&lt;/span&gt;&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Person&lt;/span&gt;&amp;gt;&amp;gt; v = &lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Point&lt;/span&gt;, &lt;span style="COLOR:#2b91af;"&gt;Stack&lt;/span&gt;&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Person&lt;/span&gt;&amp;gt;&amp;gt;();&lt;/pre&gt;
&lt;p&gt;with less typing and margin for typing errors.&lt;/p&gt;
&lt;h4&gt;Field Type Inference&lt;/h4&gt;
&lt;p&gt;The same technique could be applied to field inference:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Class
&lt;/span&gt;{
&lt;em&gt;    &lt;span style="COLOR:blue;"&gt;private&lt;/span&gt; someDicionary = &lt;span style="COLOR:blue;"&gt;new &lt;span style="COLOR:blue;"&gt;&lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;, &lt;span style="COLOR:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;&amp;gt;&amp;gt;&lt;/span&gt;();&lt;/em&gt;

    &lt;span style="COLOR:green;"&gt;// ...
&lt;/span&gt;}&lt;/pre&gt;
&lt;p&gt;with the same benefits of less typing and margin for typing errors.&lt;/p&gt;
&lt;p&gt;If field type inference were to be applied to public fields, one constraint must be enforced though: the inferenced type cannot be or have as a type parameter an anonymous type.&lt;/p&gt;
&lt;p&gt;But I wouldn&amp;#39;t recommend that because it would be easy and not obvious that a small change in the field initialization could bring unobvious changes to the public interface of the class.&lt;/p&gt;
&lt;h4&gt;Method Output&amp;nbsp; And Parameter Type Inference&lt;/h4&gt;
&lt;p&gt;Since type inference would be possible outside of methods, should it be allowed on method output and parameter values? Something like this:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;SomeClass
&lt;/span&gt;{
&lt;em&gt;    &lt;span style="COLOR:blue;"&gt;private &lt;/span&gt;listOfStuff = &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;Stuff&lt;/span&gt;&amp;gt;();&lt;/em&gt;

    &lt;span style="COLOR:blue;"&gt;public void &lt;/span&gt;DoIt()
    {
        &lt;span style="COLOR:blue;"&gt;if &lt;/span&gt;(CreateList(&lt;span style="COLOR:blue;"&gt;out this&lt;/span&gt;.listOfStuff))
        {
            ProcessList(&lt;span style="COLOR:blue;"&gt;ref this&lt;/span&gt;.listOfStuff);

            &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.listOfStuff = TransformList(&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.listOfStuff);
        }
    }

&lt;em&gt;    &lt;span style="COLOR:blue;"&gt;private bool &lt;/span&gt;CreateList(&lt;font color="#0000ff"&gt;var&lt;/font&gt; &lt;span style="COLOR:blue;"&gt;out &lt;/span&gt;list)&lt;/em&gt;
    {
        list = &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;Stuff&lt;/span&gt;&amp;gt;();
        &lt;span style="COLOR:blue;"&gt;return true&lt;/span&gt;;
    }

&lt;em&gt;    &lt;span style="COLOR:blue;"&gt;private void &lt;/span&gt;ProcessList(&lt;font color="#0000ff"&gt;var&lt;/font&gt; &lt;span style="COLOR:blue;"&gt;ref &lt;/span&gt;list)&lt;/em&gt;
    {
        &lt;span style="COLOR:green;"&gt;// ... &lt;/span&gt;
    }

&lt;em&gt;    &lt;span style="COLOR:blue;"&gt;private &lt;/span&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt; TransformList(&lt;font color="#0000ff"&gt;var&lt;/font&gt; list)&lt;/em&gt;
    {
        &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;list;
    }
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;which look very strange and confusing, to say the least. We shouldn&amp;#39;t go there.&lt;/p&gt;
&lt;h4&gt;Constructor Inference&lt;/h4&gt;
&lt;p&gt;Every since I saw local variable type inference the first time, I have the feeling that more could have been done.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s look at this hypothetical set of declarations:&lt;/p&gt;&lt;pre class="code"&gt;&lt;em&gt;&lt;span style="COLOR:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Point&lt;/span&gt;, &lt;span style="COLOR:#2b91af;"&gt;Stack&lt;/span&gt;&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Person&lt;/span&gt;&amp;gt;&amp;gt; v = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt;();
&lt;span style="COLOR:#2b91af;"&gt;Point &lt;/span&gt;p = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt;(1, 2);&lt;/em&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;It&amp;#39;s as easy to the compiler or a human reading the code that this is the same as:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Point&lt;/span&gt;, &lt;span style="COLOR:#2b91af;"&gt;Stack&lt;/span&gt;&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Person&lt;/span&gt;&amp;gt;&amp;gt; v = &lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Point&lt;/span&gt;, &lt;span style="COLOR:#2b91af;"&gt;Stack&lt;/span&gt;&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Person&lt;/span&gt;&amp;gt;&amp;gt;();
&lt;span style="COLOR:#2b91af;"&gt;Point &lt;/span&gt;p = &lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Point&lt;/span&gt;(1, 2);&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;And this can be more powerful than local variable type inference and used in a lot more scenarios:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Class
&lt;/span&gt;{
&lt;em&gt;    &lt;span style="COLOR:blue;"&gt;private &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;, &lt;span style="COLOR:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;&amp;gt;&amp;gt; someDicionary = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt;();&lt;/em&gt;
    &lt;span style="COLOR:blue;"&gt;private &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Point &lt;/span&gt;p;

    &lt;span style="COLOR:blue;"&gt;public &lt;/span&gt;Class()
    {
&lt;em&gt;        &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.p = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt;(1, 1);&lt;/em&gt;
    }

    &lt;span style="COLOR:blue;"&gt;public void &lt;/span&gt;SomeMethod()
    {
&lt;em&gt;        AnotherMethod(&lt;span style="COLOR:blue;"&gt;new&lt;/span&gt;());&lt;/em&gt;
    }

    &lt;span style="COLOR:blue;"&gt;private void &lt;/span&gt;AnotherMethod(&lt;span style="COLOR:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;&amp;gt; arg)
    {
        &lt;span style="COLOR:green;"&gt;// ...
    &lt;/span&gt;}
}&lt;/pre&gt;
&lt;h5&gt;Where To Stop?&lt;/h5&gt;
&lt;p&gt;The compiler could as easily infer the type of a local variable in this:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:blue;"&gt;public void &lt;/span&gt;SomeMethod()
{
&lt;em&gt;    &lt;span style="COLOR:blue;"&gt;var &lt;/span&gt;v = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt;();
    AnotherMethod(v);&lt;/em&gt;
}&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Do we want to go there? I don&amp;#39;t think so.&lt;/p&gt;
&lt;h5&gt;Ambiguities&lt;/h5&gt;
&lt;p&gt;&lt;a title="Visual C#" href="http://msdn2.microsoft.com/library/kx37x362.aspx" target="_blank"&gt;C# 3.0&lt;/a&gt; also brought &lt;a title="Object and Collection Initializers (C# Programming Guide)" href="http://msdn2.microsoft.com/library/c58f3db5-d7d4-4651-bd2d-5a3a97357f61.aspx" target="_blank"&gt;object initializers&lt;/a&gt;. Instead of this:&lt;/p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:#2b91af;"&gt;XmlReaderSettings &lt;/span&gt;settings = &lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;XmlReaderSettings&lt;/span&gt;();
settings.CheckCharacters = &lt;span style="COLOR:blue;"&gt;false&lt;/span&gt;;
settings.IgnoreWhitespace = &lt;span style="COLOR:blue;"&gt;true&lt;/span&gt;;

&lt;span style="COLOR:#2b91af;"&gt;XmlReader &lt;/span&gt;reader = &lt;span style="COLOR:#2b91af;"&gt;XmlReader&lt;/span&gt;.Create(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;someURI&amp;quot;&lt;/span&gt;, settings);&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;we can just write this:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:#2b91af;"&gt;XmlReaderSettings &lt;/span&gt;settings = &lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;XmlReaderSettings&lt;/span&gt;() { CheckCharacters = &lt;span style="COLOR:blue;"&gt;false&lt;/span&gt;, IgnoreWhitespace = &lt;span style="COLOR:blue;"&gt;true &lt;/span&gt;};

&lt;span style="COLOR:#2b91af;"&gt;XmlReader &lt;/span&gt;reader = &lt;span style="COLOR:#2b91af;"&gt;XmlReader&lt;/span&gt;.Create(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;someURI&amp;quot;&lt;/span&gt;, settings);&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;or this:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:#2b91af;"&gt;XmlReader &lt;/span&gt;reader = &lt;span style="COLOR:#2b91af;"&gt;XmlReader&lt;/span&gt;.Create(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;someURI&amp;quot;&lt;/span&gt;,&amp;nbsp; &lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;XmlReaderSettings&lt;/span&gt;() { CheckCharacters = &lt;span style="COLOR:blue;"&gt;false&lt;/span&gt;, IgnoreWhitespace = &lt;span style="COLOR:blue;"&gt;true &lt;/span&gt;});&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Wouldn&amp;#39;t it be nice to just write:&lt;/p&gt;&lt;pre class="code"&gt;&lt;em&gt;&lt;span style="COLOR:#2b91af;"&gt;XmlReaderSettings &lt;/span&gt;settings = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt;() { CheckCharacters = &lt;span style="COLOR:blue;"&gt;false&lt;/span&gt;, IgnoreWhitespace = &lt;span style="COLOR:blue;"&gt;true &lt;/span&gt;};&lt;/em&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;&lt;a title="Visual C#" href="http://msdn2.microsoft.com/library/kx37x362.aspx" target="_blank"&gt;C# 3.0&lt;/a&gt; &lt;a title="Object and Collection Initializers (C# Programming Guide)" href="http://msdn2.microsoft.com/library/c58f3db5-d7d4-4651-bd2d-5a3a97357f61.aspx" target="_blank"&gt;object initializers&lt;/a&gt; also allow constructor parenthesis to be omitted:&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="COLOR:#2b91af;"&gt;XmlReaderSettings &lt;/span&gt;settings = &lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;XmlReaderSettings &lt;/span&gt;{ CheckCharacters = &lt;span style="COLOR:blue;"&gt;false&lt;/span&gt;, IgnoreWhitespace = &lt;span style="COLOR:blue;"&gt;true &lt;/span&gt;};&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;which would lead to:&lt;/p&gt;&lt;pre class="code"&gt;&lt;em&gt;&lt;span style="COLOR:#2b91af;"&gt;XmlReaderSettings &lt;/span&gt;settings = &lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;{ CheckCharacters = &lt;span style="COLOR:blue;"&gt;false&lt;/span&gt;, IgnoreWhitespace = &lt;span style="COLOR:blue;"&gt;true &lt;/span&gt;};&lt;/em&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;which looks exactly like an anonymous object creation expression and could lead to some confusion and ambiguities.&lt;/p&gt;
&lt;p&gt;But it would be nice to just write:&lt;/p&gt;&lt;pre class="code"&gt;&lt;em&gt;&lt;span style="COLOR:#2b91af;"&gt;XmlReader &lt;/span&gt;reader = &lt;span style="COLOR:#2b91af;"&gt;XmlReader&lt;/span&gt;.Create(&lt;span style="COLOR:#a31515;"&gt;&amp;quot;someURI&amp;quot;&lt;/span&gt;, &lt;span style="COLOR:blue;"&gt;new &lt;/span&gt;{ settings.CheckCharacters = &lt;span style="COLOR:blue;"&gt;false&lt;/span&gt;, settings.IgnoreWhitespace = &lt;span style="COLOR:blue;"&gt;true &lt;/span&gt;});&lt;/em&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Wouldn&amp;#39;t it?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1598814" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category></item><item><title>TypeMock: How to Make Reflective Mocks More Natural</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/01/31/typemock-how-to-make-reflective-mocks-more-natural.aspx</link><pubDate>Thu, 31 Jan 2008 23:56:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1489214</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1489214</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1489214</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/01/31/typemock-how-to-make-reflective-mocks-more-natural.aspx#comments</comments><description>&lt;p&gt;Like I &lt;a title="TypeMock: Making Reflective Mocks More Natural" href="http://msmvps.com/blogs/paulomorgado/archive/2008/01/29/typemock-making-reflective-mocks-more-natural.aspx" target="_blank"&gt;said before&lt;/a&gt;, this as been on the back of my mind for a while.&lt;/p&gt;
&lt;p&gt;A while back &lt;a class="" title="Getting MethodInfo using LINQ" href="http://msmvps.com/blogs/paulomorgado/archive/2007/03/23/getting-methodinfo-using-linq.aspx" target="_blank"&gt;I introduced a way to get the MethodInfo&lt;/a&gt; of a method in a strongly typed way using &lt;a title="The LINQ Project" href="http://msdn2.microsoft.com/netframework/aa904594.aspx" target="_blank"&gt;LINQ&lt;/a&gt;, and that&amp;#39;s how I&amp;#39;m going to make &lt;a title="Overview" href="http://www.typemock.com/Docs/UserGuide/OverView.html" target="_blank"&gt;Reflective Mocks&lt;/a&gt; more &lt;a title="Natural TypeMocks™" href="http://www.typemock.com/Docs/UserGuide/NaturalMocks.html" target="_blank"&gt;Natural&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Well, it&amp;#39;s as easy as this:&lt;/p&gt;&lt;pre style="BORDER-RIGHT:thin outset;PADDING-RIGHT:10px;BORDER-TOP:thin groove;PADDING-LEFT:10px;BACKGROUND:#ffffff;OVERFLOW-X:auto;PADDING-BOTTOM:10px;BORDER-LEFT:thin groove;PADDING-TOP:10px;BORDER-BOTTOM:thin outset;FONT-FAMILY:consolas;"&gt;&lt;span style="COLOR:blue;"&gt;public static class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;MockExtender
&lt;/span&gt;{
    &lt;span style="COLOR:blue;"&gt;public static &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;IParameters &lt;/span&gt;ExpectAndReturn&amp;lt;T1, T2, TResult&amp;gt;(&lt;span style="COLOR:blue;"&gt;this &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;IMockControl &lt;/span&gt;mock, &lt;span style="COLOR:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="COLOR:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T1, T2, TResult&amp;gt;&amp;gt; expression, &lt;span style="COLOR:blue;"&gt;object &lt;/span&gt;ret, &lt;span style="COLOR:blue;"&gt;params &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Type&lt;/span&gt;[] genericTypes)
    {
        &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;mock.ExpectAndReturn((expression.Body &lt;span style="COLOR:blue;"&gt;as &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;MethodCallExpression&lt;/span&gt;).Method.Name, ret, genericTypes);
    }
}&lt;/pre&gt;
&lt;p align="justify"&gt;(For now, I&amp;#39;ll leave to someone else the implementation of the rest of the overloads)&lt;/p&gt;
&lt;p align="justify"&gt;With this implementation it&amp;#39;s possible to handle static classes (a limitation of &lt;a title="iridescence.no" href="http://www.iridescence.no/" target="_blank"&gt;Fredrik&lt;/a&gt;&amp;#39;s &lt;a title="A Type Safe ExpectCall Extension Method for Reflective TypeMocks" href="http://www.iridescence.no/Posts/A-Type-Safe-ExpectCall-Extension-Method-for-Reflective-TypeMocks.aspx" target="_blank"&gt;implementation&lt;/a&gt;).&lt;/p&gt;
&lt;p align="justify"&gt;As for private methods, just let &lt;a title="Visual Studio Developer Center" href="http://msdn2.microsoft.com/en-us/vstudio/default.aspx" target="_blank"&gt;Visual Studio&lt;/a&gt; (2008, in this sample) and &lt;a title="TypeMock™ - Simplify Unit Testing" href="http://www.typemock.com/" target="_blank"&gt;TypeMock&lt;/a&gt; do their magic.&lt;/p&gt;
&lt;p align="justify"&gt;So, to test this class:&lt;/p&gt;&lt;pre style="BORDER-RIGHT:thin outset;PADDING-RIGHT:10px;BORDER-TOP:thin groove;PADDING-LEFT:10px;BACKGROUND:#ffffff;OVERFLOW-X:auto;PADDING-BOTTOM:10px;BORDER-LEFT:thin groove;PADDING-TOP:10px;BORDER-BOTTOM:thin outset;FONT-FAMILY:consolas;"&gt;&lt;span style="COLOR:blue;"&gt;public static class &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;Class1
&lt;/span&gt;{
    &lt;span style="COLOR:blue;"&gt;public static string &lt;/span&gt;PublicMethod(&lt;span style="COLOR:blue;"&gt;string &lt;/span&gt;param1, &lt;span style="COLOR:blue;"&gt;int &lt;/span&gt;param2)
    {
        &lt;span style="COLOR:blue;"&gt;return &lt;/span&gt;PrivateMethod(param2, param1);
    }

    &lt;span style="COLOR:blue;"&gt;private static string &lt;/span&gt;PrivateMethod(&lt;span style="COLOR:blue;"&gt;int &lt;/span&gt;param2, &lt;span style="COLOR:blue;"&gt;string &lt;/span&gt;param1)
    {
        &lt;span style="COLOR:blue;"&gt;throw new &lt;/span&gt;&lt;span style="COLOR:#2b91af;"&gt;NotImplementedException&lt;/span&gt;();
    }
}&lt;/pre&gt;
&lt;p&gt;We just write this test:&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;&lt;pre style="BORDER-RIGHT:thin outset;PADDING-RIGHT:10px;BORDER-TOP:thin groove;PADDING-LEFT:10px;BACKGROUND:#ffffff;OVERFLOW-X:auto;PADDING-BOTTOM:10px;BORDER-LEFT:thin groove;PADDING-TOP:10px;BORDER-BOTTOM:thin outset;FONT-FAMILY:consolas;"&gt;[&lt;span style="COLOR:#2b91af;"&gt;TestMethod&lt;/span&gt;()]
&lt;span style="COLOR:blue;"&gt;public void &lt;/span&gt;PublicMethodTest()
{
    &lt;span style="COLOR:blue;"&gt;string &lt;/span&gt;param1 = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;param&amp;quot;&lt;/span&gt;;
    &lt;span style="COLOR:blue;"&gt;int &lt;/span&gt;param2 = 5;
    &lt;span style="COLOR:blue;"&gt;string &lt;/span&gt;expected = &lt;span style="COLOR:#a31515;"&gt;&amp;quot;return&amp;quot;&lt;/span&gt;;
    &lt;span style="COLOR:blue;"&gt;string &lt;/span&gt;actual;

    &lt;span style="COLOR:#2b91af;"&gt;Mock &lt;/span&gt;targetMock = &lt;span style="COLOR:#2b91af;"&gt;MockManager&lt;/span&gt;.Mock(&lt;span style="COLOR:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="COLOR:#2b91af;"&gt;Class1&lt;/span&gt;));

    targetMock.ExpectAndReturn((&lt;span style="COLOR:blue;"&gt;int &lt;/span&gt;i, &lt;span style="COLOR:blue;"&gt;string &lt;/span&gt;s) =&amp;gt; ClassLibrary1.&lt;span style="COLOR:#2b91af;"&gt;Class1_Accessor&lt;/span&gt;.PrivateMethod(i, s), expected).Args(param2, param1);

    actual = &lt;span style="COLOR:#2b91af;"&gt;Class1&lt;/span&gt;.PublicMethod(param1, param2);

    &lt;span style="COLOR:#2b91af;"&gt;Assert&lt;/span&gt;.AreEqual(expected, actual);
}&lt;/pre&gt;
&lt;p&gt;How about this for clean and simple?&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1489214" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MVP/default.aspx">MVP</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Tools/default.aspx">Tools</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Testing/default.aspx">Testing</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/UnitTests/default.aspx">UnitTests</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TypeMock/default.aspx">TypeMock</category></item><item><title>TypeMock Snippets For Visual Studio</title><link>http://msmvps.com/blogs/paulomorgado/archive/2008/01/13/typemock-snippets-for-visual-studio.aspx</link><pubDate>Sun, 13 Jan 2008 23:37:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1461781</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>9</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1461781</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1461781</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2008/01/13/typemock-snippets-for-visual-studio.aspx#comments</comments><description>&lt;p&gt;I&amp;#39;ve just created a set of &lt;a title="Creating and Using IntelliSense Code Snippets" href="http://msdn2.microsoft.com/library/85976ad9-4c9a-4e7b-896e-66ec6f955199.aspx" target="_blank"&gt;code snippets&lt;/a&gt; for &lt;a title="Visual Studio" href="http://msdn2.microsoft.com/vstudio/" target="_blank"&gt;Visual Studio&lt;/a&gt; for my most used features of &lt;a title="TypeMock - Simplify Unit Testing" href="http://www.typemock.com/" target="_blank"&gt;TypeMock&lt;/a&gt;. Feel free to use it.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1461781" width="1" height="1"&gt;</description><enclosure url="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Components.PostAttachments/00.01.46.17.81/TypeMock-snippets-for-Visual-Studio.zip" length="5082" type="application/x-zip-compressed" /><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Tools/default.aspx">Tools</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Testing/default.aspx">Testing</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TypeMock/default.aspx">TypeMock</category></item><item><title>Stop Designing for Testability (by Eli Lopian)</title><link>http://msmvps.com/blogs/paulomorgado/archive/2007/12/26/stop-designing-for-testability-by-eli-lopian.aspx</link><pubDate>Wed, 26 Dec 2007 21:25:54 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1420759</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1420759</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1420759</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2007/12/26/stop-designing-for-testability-by-eli-lopian.aspx#comments</comments><description>&lt;p align="justify"&gt;&lt;a title="Eli Lopian&amp;rsquo;s Blog (TypeMock)" href="http://www.elilopian.com/" target="_blank"&gt;Eli Lopian&lt;/a&gt; from &lt;a title="TypeMock&amp;trade; - Simplify Unit Testing" href="http://www.typemock.com/" target="_blank"&gt;TypeMock™&lt;/a&gt;, has an &lt;a title="Stop Designing for Testability" href="http://www.codeproject.com/KB/dotnet/StopDesign4Tests.aspx" target="_blank"&gt;article&lt;/a&gt; on &lt;a title="CodeProject. Free source code and programming articles." href="http://www.codeproject.com/" target="_blank"&gt;CodeProject&lt;/a&gt; about the disadvantages of &lt;strong&gt;design for testability&lt;/strong&gt; and how to use &lt;a title="TypeMock&amp;trade; - Simplify Unit Testing" href="http://www.typemock.com/" target="_blank"&gt;TypeMock™&lt;/a&gt; to remove these disadvantages while keep the advantages of unit testing.&lt;/p&gt; &lt;p&gt;I have to say that I agree with Eli: &lt;strong&gt;design for testability&lt;/strong&gt; is BAD. It exposes more that it needs just for the purpose of testing and might increase the number of classes and interfaces that need to be implemented, tested and maintained. It also increases the attack surface of the system being built.&lt;/p&gt; &lt;p&gt;I am a firm believer in &lt;strong&gt;code for testability&lt;/strong&gt;. Using tools like &lt;a title="Visual Studio Developer Center" href="http://msdn2.microsoft.com/en-us/vstudio/default.aspx" target="_blank"&gt;Visual Studio&lt;/a&gt; and &lt;a title="TypeMock&amp;trade; - Simplify Unit Testing" href="http://www.typemock.com/" target="_blank"&gt;TypeMock™&lt;/a&gt; you can easily test private members of a class. You can do almost the same you would do in &lt;strong&gt;design for testability&lt;/strong&gt; without exposing what doesn&amp;#39;t need to be exposed and go even further by factoring your code in smaller methods easier to test.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1420759" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MVP/default.aspx">MVP</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Testing/default.aspx">Testing</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/UnitTests/default.aspx">UnitTests</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TypeMock/default.aspx">TypeMock</category></item><item><title>Unit Test Patterns for .NET (from TypeMock™)</title><link>http://msmvps.com/blogs/paulomorgado/archive/2007/12/26/unit-test-patterns-for-net-from-typemock.aspx</link><pubDate>Wed, 26 Dec 2007 20:21:39 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1420678</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1420678</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1420678</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2007/12/26/unit-test-patterns-for-net-from-typemock.aspx#comments</comments><description>&lt;p&gt;There is a good set of articles about &lt;strong&gt;Unit Test Patterns&lt;/strong&gt; in the &lt;a title="TypeMock&amp;trade; - Simplify Unit Testing" href="http://www.typemock.com/" target="_blank"&gt;TypeMock™&lt;/a&gt; site:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a title="Unit-Test Patterns for .NET - Part I" href="http://www.typemock.com/Docs/TestPatterns.html" target="_blank"&gt;Unit-Test Patterns for .NET - Part I&lt;/a&gt;&lt;br /&gt;This article looks at patterns in unit testing and describes the main patterns found in tested .NET code. It also describes the problems with each pattern.  &lt;li&gt;&lt;a title="Unit Test Patterns for .NET - Part II - TypeMocks" href="http://www.typemock.com/Docs/Mock%20Types.html" target="_blank"&gt;Unit Test Patterns for .NET - Part II - TypeMocks&lt;/a&gt;&lt;br /&gt;Programmers who have incorporated unit testing into their development process already know its advantages: cleaner code, courage to refactor, and higher speed. But even the most die-hard unit testers can falter when faced with testing a class that relies on system state for its behavior. This article looks at the &lt;strong&gt;TypeMock pattern&lt;/strong&gt; that can help you solve these problems.  &lt;li&gt;&lt;a title="Unit-Test Patterns for .NET - Part III - Natural TypeMocks&amp;trade;" href="http://www.typemock.com/Docs/NaturalTypeMocks.html" target="_blank"&gt;Unit-Test Patterns for .NET - Part III - Natural TypeMocks™&lt;/a&gt;&lt;br /&gt;In this series, unit-test patterns and the advantages that it brings have been discussed. Although there is great power in using TypeMocks, there are times when the reflective API can falter when refactoring code. This article will look at how to test the interaction between classes using Natural Type Mocks to solve these problems.&lt;/li&gt;&lt;/ul&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1420678" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Community/default.aspx">Community</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MVP/default.aspx">MVP</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Tools/default.aspx">Tools</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Testing/default.aspx">Testing</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/UnitTests/default.aspx">UnitTests</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/TypeMock/default.aspx">TypeMock</category></item><item><title>TypeTypeConverter vs. TypeNameConverter</title><link>http://msmvps.com/blogs/paulomorgado/archive/2007/11/25/typetypeconverter-vs-typenameconverter.aspx</link><pubDate>Sun, 25 Nov 2007 22:37:45 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1356399</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/rsscomments.aspx?PostID=1356399</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/paulomorgado/commentapi.aspx?PostID=1356399</wfw:comment><comments>http://msmvps.com/blogs/paulomorgado/archive/2007/11/25/typetypeconverter-vs-typenameconverter.aspx#comments</comments><description>&lt;p&gt;&lt;a title="TypeTypeConverter - The Type TypeConverter" href="http://msmvps.com/blogs/paulomorgado/archive/2007/07/09/typetypeconverter-the-type-typeconverter.aspx" target="_blank"&gt;Some time ago&lt;/a&gt; I complained about the fact that a &lt;a title="TypeConverter Class" href="http://msdn2.microsoft.com/library/System.ComponentModel.TypeConverter.aspx" target="_blank"&gt;TypeConverter&lt;/a&gt; for &lt;a title="Type Class" href="http://msdn2.microsoft.com/library/System.Type.aspx" target="_blank"&gt;Type&lt;/a&gt;s was missing from the &lt;a title=".NET Framework" href="http://msdn2.microsoft.com/netframework/" target="_blank"&gt;.NET Framework&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;At the time I had search for one in the framework but only found internal or private implementations.&lt;/p&gt; &lt;p&gt;As it turns out, the version 2.0 of the .NET Framework introduced a &lt;a title="TypeNameConverter Class" href="http://msdn2.microsoft.com/library/System.Configuration.TypeNameConverter.aspx" target="_blank"&gt;TypeNameConverter&lt;/a&gt; that does practically the same thing as my &lt;strong&gt;TypeTypeConverter&lt;/strong&gt;, beside the poor naming.&lt;/p&gt; &lt;p&gt;I say poor naming because the documentation for &lt;a title="TypeConverter Class" href="http://msdn2.microsoft.com/library/System.ComponentModel.TypeConverter.aspx" target="_blank"&gt;TypeConverter&lt;/a&gt; states that &amp;quot;&lt;em&gt;The most common type of converter is one that converts to and from a text representation.&lt;/em&gt;&amp;quot;. This converter does not convert from text to a &lt;strong&gt;Type&lt;/strong&gt; &lt;strong&gt;Name&lt;/strong&gt; but to an instance of &lt;strong&gt;Type&lt;/strong&gt;. Nevertheless, it&amp;#39;s in the framework and you should use this one instead of mine.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1356399" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/.NET/default.aspx">.NET</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/SoftDev/default.aspx">SoftDev</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://msmvps.com/blogs/paulomorgado/archive/tags/MVP/default.aspx">MVP</category></item></channel></rss>