<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Peter Ritchie's MVP Blog : Visual Studio 2010</title><link>http://msmvps.com/blogs/peterritchie/archive/tags/Visual+Studio+2010/default.aspx</link><description>Tags: Visual Studio 2010</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>.NET 4.0, Evolving .NET Development</title><link>http://msmvps.com/blogs/peterritchie/archive/2008/11/12/net-4-0-evolving-net-development.aspx</link><pubDate>Wed, 12 Nov 2008 16:02:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1653897</guid><dc:creator>PeterRitchie</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/peterritchie/rsscomments.aspx?PostID=1653897</wfw:commentRss><comments>http://msmvps.com/blogs/peterritchie/archive/2008/11/12/net-4-0-evolving-net-development.aspx#comments</comments><description>&lt;p&gt;.NET 4.0 is the first release of .NET since 2.0 that evolves .NET for every programmer.&amp;nbsp; .NET 3.0 was largely LINQ and .NET 3.5 was largely new namespaces (like WCF, WWF, etc.) &lt;/p&gt;
&lt;p&gt;.NET 4.0 evolves the programming and design for any programmer.&amp;nbsp; It offers framework support for parallel processing (PFX will be released), Code Contracts (now DbC is a reality at the framework level, and opens the possibility of it being a reality at the language level post 2010), variance changes (co- and contra-variance on generics interfaces and delegates is now a reality). &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Parallel Processing &lt;br /&gt;&lt;/strong&gt;Moore&amp;#39;s law has changed from single processors doubling in speed every 18 months to doubling in processing power through increased core count every 18 months.&amp;nbsp; This means for applications to make use of processing power increases they must increasingly make use of parallel processing and multi-threading.&amp;nbsp; The PFX makes this more a reality by providing a framework by which application designers can more easily write code to support multi-core processors and multi-processor computers. &lt;/p&gt;
&lt;p&gt;With PFX writing a loop to make use of multiple processors (while still supporting single processors) will be as easy as: &lt;/p&gt;
&lt;div style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:Courier New;"&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;uint&lt;/span&gt;[] numbers = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;uint&lt;/span&gt;[] {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Parallel&lt;/span&gt;.ForEach(numbers, &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;uint&lt;/span&gt; number) { &lt;span style="color:#2b91af;"&gt;Trace&lt;/span&gt;.WriteLine(CalculateFibonacci(number)); });&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Code Contracts&lt;/strong&gt; &lt;br /&gt;Design by contract is a form of writing software with verifiable interface specifications.&amp;nbsp; These specifications can be used at compile time to find code that breaks the contract and not require checking of the contract at run-time.&amp;nbsp; For example: &lt;/p&gt;
&lt;div style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:Courier New;"&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color:#2b91af;"&gt;ContractInvariantMethod&lt;/span&gt;]&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Calculate()&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; result = 0;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; value &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; values)&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.operation(&lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; result, value);&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; result;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;If anything modifies the current class within the Calculate method, an exception will be thrown at run-time.&amp;nbsp; Compilers will eventually be able to perform rudimentary checks at compile-time to ensure these contracts are abided by.&amp;nbsp; For example:&lt;/p&gt;
&lt;div style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:Courier New;"&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color:#2b91af;"&gt;ContractInvariantMethod&lt;/span&gt;]&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; Calculate()&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; result = 0;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; value &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; values)&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.operation(&lt;span style="color:#0000ff;"&gt;ref&lt;/span&gt; result, value);&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;.date = &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;.Now;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; result;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;...may eventually cause a compile error on the assignment to this.date.&amp;nbsp; The person designing this type intended this method to be invariant, meaning it doesn&amp;#39;t change the state of the object to which it belongs.&amp;nbsp; This design attribute can now be guaranteed. &lt;/p&gt;
&lt;p&gt;Being able to include more design aspects in code and code definitions is a great step forward in not only writing intention-revealing code but in the ability to write more reliable code. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Variance changes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;C# has always had intuitive variance when it came to arrays.&amp;nbsp; For example, the following is valid code:&lt;/p&gt;
&lt;div style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:Courier New;"&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Shape&lt;/span&gt;[] shapes = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Triangle&lt;/span&gt;[10];&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Given:&lt;/p&gt;
&lt;div style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:Courier New;"&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Shape&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;//...&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Triangle&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;Shape&lt;/span&gt; {&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000;"&gt;//...&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;Generics variance was a different storey.  Prior to Visual C# 2010, this following is a compile error:&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&lt;div style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:Courier New;"&gt;&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Triangle&lt;/span&gt;&amp;gt; triangle = () =&amp;gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Triangle&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Shape&lt;/span&gt;&amp;gt; shape = triangle;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;...despite Triangle being a type of shape (or otherwise known as &amp;quot;bigger&amp;quot; than Shape).  This is known as invariant. In Visual C# 2010 you can now create delegates (as well as types and methods) that are no longer invariant.  For example, a Func delegate could be created that is covariant:&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&lt;div style="FONT-SIZE:10pt;BACKGROUND:white;COLOR:black;FONT-FAMILY:Courier New;"&gt;&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt; T &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; T&amp;gt;();&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;(not the new use of the out keword) ...which could make our previous code:&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Triangle&lt;/span&gt;&amp;gt; triangle = () =&amp;gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Triangle&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Shape&lt;/span&gt;&amp;gt; shape = triangle;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;...compiler without error.&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;The same can be done for contravariance with the the new use of the in keyword:&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt; T &lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; T&amp;gt;(T value);&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="MARGIN:0px;"&gt;For more details on generics variance, please see Eric Lippert&amp;#39;s series on generics variance: &lt;a href="http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx"&gt;http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx&lt;/a&gt;&lt;/pre&gt;
&lt;/pre&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Other&lt;/strong&gt; &lt;br /&gt;Another notable improvement is side-by-side (SxS) support for multiple versions of .NET.&amp;nbsp; This allows hosting of more than one version of the CLR within a single process.&amp;nbsp; This makes writing shell extensions, for example, in C# a reality in .NET 4.0.&amp;nbsp; You shouldn&amp;#39;t need to target .NET 4.0, but as long as .NET 4.0 is installed you should be able to write shell extensions in a current version of .NET (like .NET 2.0) and it will be supported.&amp;nbsp; Prior to .NET 4.0, a process could only have one version of the CLR loaded into a process, making extending 3rd party native applications (like the Windows shell) very problematic because what version of the CLR that was loaded into a process would depend on the first extension loaded.&amp;nbsp; If the first extension loaded was a .NET 1.1 assembly then any other extensions loaded requiring .NET 2.0 would subsequently&amp;nbsp;fail.&lt;/p&gt;
&lt;div style="text-align:left;margin:0px;padding:4px 4px 4px 4px;" class="wlWriterHeaderFooter"&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http://msmvps.com/blogs/peterritchie/archive/2008/11/12/net-4-0-evolving-net-development.aspx&amp;amp;title=.NET%204.0,%20Evolving%20.NET%20Development"&gt;&lt;img border="0" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://msmvps.com/blogs/peterritchie/archive/2008/11/12/net-4-0-evolving-net-development.aspx&amp;amp;bgcolor=0080C0&amp;amp;fgcolor=FFFFFF&amp;amp;border=000000&amp;amp;cbgcolor=D4E1ED&amp;amp;cfgcolor=000000" alt="DotNetKicks Image" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1653897" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+Development/default.aspx">.NET Development</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/.NET+4.0/default.aspx">.NET 4.0</category><category domain="http://msmvps.com/blogs/peterritchie/archive/tags/C_2300_+4.0/default.aspx">C# 4.0</category></item></channel></rss>