<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.arquitecturadesoftware.org/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>GASP</title><link>http://www.arquitecturadesoftware.org/blogs/default.aspx</link><description>Grupo de Arquitectura de Software Português</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.2)</generator><item><title>O Estranho Caso Do Computador Que Acordava Sozinho Misteriosamente</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/22/o-estranho-caso-do-computador-que-acordava-sozinho-misteriosamente.aspx</link><pubDate>Thu, 22 Jul 2010 08:16:00 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:61081</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><description>&lt;p align="justify"&gt;Normalmente, quando eu vou dormir, tamb&amp;eacute;m ponho o meu computador a dormir.&lt;/p&gt;
&lt;p align="justify"&gt;Mas, desde h&amp;aacute; alguns meses, o computador acordava sozinho e eu n&amp;atilde;o conseguia percber porqu&amp;ecirc;.&lt;/p&gt;
&lt;p align="justify"&gt;Com a ajuda do &lt;a target="_blank" href="http://www.arquitecturadesoftware.org/blogs/duniho/default.aspx" title="Peter Duniho's C# blog"&gt;Pete&lt;/a&gt; consegui perceber porqu&amp;ecirc;:&lt;/p&gt;
&lt;pre class="code"&gt;C:\&amp;gt;PowerCfg -LASTWAKE
Wake History Count - 1
Wake History [0]
  Wake Source Count - 1
  Wake Source [0]
    Type: Wake Timer
    Owner: [PROCESS] \Device\HarddiskVolume2\Windows\System32\services.exe
    Owner Supplied Reason: Windows will execute '\Microsoft\Windows\Media Center\mcupdate_scheduled' scheduled task that requested waking the computer.&lt;/pre&gt;
&lt;p align="justify"&gt;Usando &lt;strong&gt;PowerCfg &amp;ndash;LASTWAKE&lt;/strong&gt; &amp;eacute; poss&amp;iacute;vel saber o que acordou o computador da &amp;uacute;ltima vez que este acordou.&lt;/p&gt;
&lt;p align="justify"&gt;Afinal era apenas uma tarefa agendada do Media Center que acordava o meu computador.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/22/o-estranho-caso-do-computador-que-acordava-sozinho-misteriosamente.aspx&amp;amp;;subject=O+Estranho+Caso+Do+Computador+Que+Acordava+Sozinho+Misteriosamente" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/22/o-estranho-caso-do-computador-que-acordava-sozinho-misteriosamente.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/22/o-estranho-caso-do-computador-que-acordava-sozinho-misteriosamente.aspx&amp;amp;;title=O+Estranho+Caso+Do+Computador+Que+Acordava+Sozinho+Misteriosamente" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/22/o-estranho-caso-do-computador-que-acordava-sozinho-misteriosamente.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/22/o-estranho-caso-do-computador-que-acordava-sozinho-misteriosamente.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/22/o-estranho-caso-do-computador-que-acordava-sozinho-misteriosamente.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/22/o-estranho-caso-do-computador-que-acordava-sozinho-misteriosamente.aspx&amp;amp;title=O+Estranho+Caso+Do+Computador+Que+Acordava+Sozinho+Misteriosamente" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/22/o-estranho-caso-do-computador-que-acordava-sozinho-misteriosamente.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/22/o-estranho-caso-do-computador-que-acordava-sozinho-misteriosamente.aspx&amp;amp;;title=O+Estranho+Caso+Do+Computador+Que+Acordava+Sozinho+Misteriosamente" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/22/o-estranho-caso-do-computador-que-acordava-sozinho-misteriosamente.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/22/o-estranho-caso-do-computador-que-acordava-sozinho-misteriosamente.aspx&amp;amp;;title=O+Estranho+Caso+Do+Computador+Que+Acordava+Sozinho+Misteriosamente&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/22/o-estranho-caso-do-computador-que-acordava-sozinho-misteriosamente.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=61081" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Windows/default.aspx">Windows</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Windows7/default.aspx">Windows7</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TipsAndTricks/default.aspx">TipsAndTricks</category></item><item><title>Como Adicionar Ou Remover Instâncias Do SQL Server 2008 / 2008R2</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/02/como-adicionar-ou-remoer-inst-226-ncias-do-sql-server-2008-2008r2.aspx</link><pubDate>Fri, 02 Jul 2010 00:12:00 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:60819</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><description>&lt;P align=justify&gt;Depois de instalar o &lt;A title="Visual Studio 2010 Editions - Microsoft Visual Studio" href="http://www.microsoft.com/visualstudio/en-us/products/2010-editions" target=_blank&gt;Visual Studio 2010&lt;/A&gt;, inadvertidamente acabei com o &lt;A title="SQL Server 2008: Express" href="http://www.microsoft.com/sqlserver/2008/en/us/express.aspx" target=_blank&gt;SQL Server 2008 Express&lt;/A&gt; instalado, tendo já instalado o &lt;A title="SQL Server 2008: Developer" href="http://www.microsoft.com/sqlserver/2008/en/us/developer.aspx" target=_blank&gt;SQL Server 2008 Developer&lt;/A&gt;. Apenasquando ia actualizar para o &lt;A title="SQL Server 2008 R2 Editions" href="http://www.microsoft.com/sqlserver/2008/en/us/R2-editions.aspx" target=_blank&gt;SQL Server 2008R2&lt;/A&gt; descobri que tinha duas instancias instalads.&lt;/P&gt;
&lt;P align=justify&gt;Procurei por todo o lado e não consegui encontrar nenhuma forma de remover a instância SQLEXPRESS.&lt;/P&gt;
&lt;P align=justify&gt;Apenas quando decidi desinstalar o &lt;A title="Microsoft SQL Server" href="http://www.microsoft.com/sqlserver/" target=_blank&gt;SQL Server&lt;/A&gt; por completo descobri como o fazer.&lt;/P&gt;
&lt;TABLE cellSpacing=0 cellPadding=2&gt;

&lt;TR&gt;
&lt;TD&gt;
&lt;P align=justify&gt;No&lt;A title="Microsoft Windows 7" href="http://www.microsoft.com/windows/windows-7/" target=_blank&gt;Windows 7&lt;/A&gt;, ir a &lt;STRONG&gt;Programs and Features&lt;/STRONG&gt; e escolher &lt;STRONG&gt;Microsoft&lt;/STRONG&gt;&lt;STRONG&gt; SQL Server 2008 R2 (64-bit)&lt;/STRONG&gt; (ou qualquer que seja a versão de SQL Server de que se pretende remover a instância).&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;IMG src="http://lh5.ggpht.com/_PEyUx0qf5g0/TC0lyThOwWI/AAAAAAAAAHA/1wxzMC0zBvk/Add_Remove_SS2008_Instances_1.jpg"&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P align=justify&gt;Escolher &lt;STRONG&gt;Remove&lt;/STRONG&gt; (ou &lt;STRONG&gt;Add&lt;/STRONG&gt;, se se pretende adicionar uma instância).&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;IMG src="http://lh3.ggpht.com/_PEyUx0qf5g0/TC0o_M_9G9I/AAAAAAAAAHY/nnSetqLSXd0/Add_Remove_SS2008_Instances_2.jpg"&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P align=justify&gt;Seguir os passos e escolher a instância que se pretende remover.&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;&lt;IMG src="http://lh4.ggpht.com/_PEyUx0qf5g0/TC0pp2g_fbI/AAAAAAAAAHw/iS4EpuWGYlI/Add_Remove_SS2008_Instances_3.jpg"&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;Seleccionar as funcionalidades que se pretende remover (seleccionar todas as funcionalidades para remover a instância). &lt;BR&gt;&lt;STRONG&gt;Nota:&lt;/STRONG&gt; Não remover as funcionalidades partilhadas se não se pretendem remover outras instâncias&lt;/TD&gt;
&lt;TD&gt;&lt;IMG src="http://lh3.ggpht.com/_PEyUx0qf5g0/TC0pqI1ZSHI/AAAAAAAAAH0/EbCCrWXpAWw/Add_Remove_SS2008_Instances_4.jpg"&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;
&lt;P align=justify&gt;Talvez seja algo que eu devesse saber, mas não sabia e não foi nada fácil encontrar.&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/02/como-adicionar-ou-remoer-inst-226-ncias-do-sql-server-2008-2008r2.aspx&amp;amp;;subject=Como+Adicionar+Ou+Remover+Inst%26%23226%3bncias+Do+SQL+Server+2008+%2f+2008R2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/02/como-adicionar-ou-remoer-inst-226-ncias-do-sql-server-2008-2008r2.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/02/como-adicionar-ou-remoer-inst-226-ncias-do-sql-server-2008-2008r2.aspx&amp;amp;;title=Como+Adicionar+Ou+Remover+Inst%26%23226%3bncias+Do+SQL+Server+2008+%2f+2008R2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/02/como-adicionar-ou-remoer-inst-226-ncias-do-sql-server-2008-2008r2.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/02/como-adicionar-ou-remoer-inst-226-ncias-do-sql-server-2008-2008r2.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/02/como-adicionar-ou-remoer-inst-226-ncias-do-sql-server-2008-2008r2.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/02/como-adicionar-ou-remoer-inst-226-ncias-do-sql-server-2008-2008r2.aspx&amp;amp;title=Como+Adicionar+Ou+Remover+Inst%26%23226%3bncias+Do+SQL+Server+2008+%2f+2008R2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/02/como-adicionar-ou-remoer-inst-226-ncias-do-sql-server-2008-2008r2.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/02/como-adicionar-ou-remoer-inst-226-ncias-do-sql-server-2008-2008r2.aspx&amp;amp;;title=Como+Adicionar+Ou+Remover+Inst%26%23226%3bncias+Do+SQL+Server+2008+%2f+2008R2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/02/como-adicionar-ou-remoer-inst-226-ncias-do-sql-server-2008-2008r2.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/02/como-adicionar-ou-remoer-inst-226-ncias-do-sql-server-2008-2008r2.aspx&amp;amp;;title=Como+Adicionar+Ou+Remover+Inst%26%23226%3bncias+Do+SQL+Server+2008+%2f+2008R2&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/07/02/como-adicionar-ou-remoer-inst-226-ncias-do-sql-server-2008-2008r2.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=60819" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/SQLServer/default.aspx">SQLServer</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/SQLServer2008/default.aspx">SQLServer2008</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TipsAndTricks/default.aspx">TipsAndTricks</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/SQLServer2005/default.aspx">SQLServer2005</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/SQLServer2008R2/default.aspx">SQLServer2008R2</category></item><item><title>Como Resolver O Problema Da Opção “Create Virtual Machine” Em Falta - Windows Virtual PC</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/20/como-resolver-o-problema-da-op-231-227-o-create-virtual-machine-em-falta-windows-virtual-pc.aspx</link><pubDate>Sun, 20 Jun 2010 18:43:00 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:60775</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><description>&lt;P align=justify&gt;Em alguns dos meus sistemas &lt;A title="Microsoft Windows 7" href="http://www.microsoft.com/windows/windows-7/" target=_blank&gt;Windows 7&lt;/A&gt;, após a instalação do &lt;A title="Windows Virtual PC" href="http://www.microsoft.com/windows/products/winfamily/virtualpc/default.mspx" target=_blank&gt;Windows Virtual PC&lt;/A&gt;, não tinham a opção &lt;STRONG&gt;Create virtual machine&lt;/STRONG&gt; na pasta das &lt;STRONG&gt;Virtual Machines&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P align=justify&gt;O &lt;A title="Bob Comer [MVP]" href="http://social.technet.microsoft.com/Profile/en-US/?user=Bob+Comer" target=_blank&gt;Bob Comer&lt;/A&gt; indicou-me &lt;A title="Fixing a missing “Create Virtual Machine” option [Windows Virtual PC]" href="http://blogs.msdn.com/b/virtual_pc_guy/archive/2009/07/06/fixing-a-missing-create-virtual-machine-option-windows-virtual-pc.aspx" target=_blank&gt;esta entrada&lt;/A&gt; no &lt;A title="Virtual PC Guy's Blog" href="http://blogs.msdn.com/virtual_pc_guy/default.aspx" target=_blank&gt;Virtual PC Guy's Blog&lt;/A&gt; mas, antes de tentar as receitas apresentadas (que envolviam reiniciar a sessão ou o sistema), tentei simplesmente usar a opção &lt;STRONG&gt;Reset Folders&lt;/STRONG&gt; na aba &lt;STRONG&gt;View&lt;/STRONG&gt; das &lt;STRONG&gt;Folder Options&lt;/STRONG&gt;. E o problema foi imediatamente resolvido.&lt;/P&gt;
&lt;P align=justify&gt;Portanto, se estiverem com o mesmo problema, talvez queiram tentar primeiro esta solução simples.&lt;/P&gt;
&lt;P align=justify&gt;No final, à cautela, adicionei os seguites atalhos ao menu &lt;STRONG&gt;Iniciar&lt;/STRONG&gt;:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV align=left&gt;&lt;STRONG&gt;Windows Virtual PC Wizard&lt;/STRONG&gt;&lt;/DIV&gt;
&lt;P align=left&gt;&lt;SPAN style="FONT-FAMILY:consolas,courier,monospace;"&gt;%SystemRoot%\System32\VPCWizard.exe&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=left&gt;&lt;STRONG&gt;Windows Virtual PC Settings&lt;/STRONG&gt;&lt;/DIV&gt;
&lt;P align=left&gt;&lt;SPAN style="FONT-FAMILY:consolas,courier,monospace;"&gt;%SystemRoot%\System32\VPCSettings.exe&lt;/SPAN&gt;&lt;/P&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/20/como-resolver-o-problema-da-op-231-227-o-create-virtual-machine-em-falta-windows-virtual-pc.aspx&amp;amp;;subject=Como+Resolver+O+Problema+Da+Op%26%23231%3b%26%23227%3bo+%e2%80%9cCreate+Virtual+Machine%e2%80%9d+Em+Falta+-+Windows+Virtual+PC" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/20/como-resolver-o-problema-da-op-231-227-o-create-virtual-machine-em-falta-windows-virtual-pc.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/20/como-resolver-o-problema-da-op-231-227-o-create-virtual-machine-em-falta-windows-virtual-pc.aspx&amp;amp;;title=Como+Resolver+O+Problema+Da+Op%26%23231%3b%26%23227%3bo+%e2%80%9cCreate+Virtual+Machine%e2%80%9d+Em+Falta+-+Windows+Virtual+PC" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/20/como-resolver-o-problema-da-op-231-227-o-create-virtual-machine-em-falta-windows-virtual-pc.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/20/como-resolver-o-problema-da-op-231-227-o-create-virtual-machine-em-falta-windows-virtual-pc.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/20/como-resolver-o-problema-da-op-231-227-o-create-virtual-machine-em-falta-windows-virtual-pc.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/20/como-resolver-o-problema-da-op-231-227-o-create-virtual-machine-em-falta-windows-virtual-pc.aspx&amp;amp;title=Como+Resolver+O+Problema+Da+Op%26%23231%3b%26%23227%3bo+%e2%80%9cCreate+Virtual+Machine%e2%80%9d+Em+Falta+-+Windows+Virtual+PC" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/20/como-resolver-o-problema-da-op-231-227-o-create-virtual-machine-em-falta-windows-virtual-pc.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/20/como-resolver-o-problema-da-op-231-227-o-create-virtual-machine-em-falta-windows-virtual-pc.aspx&amp;amp;;title=Como+Resolver+O+Problema+Da+Op%26%23231%3b%26%23227%3bo+%e2%80%9cCreate+Virtual+Machine%e2%80%9d+Em+Falta+-+Windows+Virtual+PC" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/20/como-resolver-o-problema-da-op-231-227-o-create-virtual-machine-em-falta-windows-virtual-pc.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/20/como-resolver-o-problema-da-op-231-227-o-create-virtual-machine-em-falta-windows-virtual-pc.aspx&amp;amp;;title=Como+Resolver+O+Problema+Da+Op%26%23231%3b%26%23227%3bo+%e2%80%9cCreate+Virtual+Machine%e2%80%9d+Em+Falta+-+Windows+Virtual+PC&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/20/como-resolver-o-problema-da-op-231-227-o-create-virtual-machine-em-falta-windows-virtual-pc.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=60775" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/VirtualPC/default.aspx">VirtualPC</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Windows7/default.aspx">Windows7</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TipsAndTricks/default.aspx">TipsAndTricks</category></item><item><title>O Vosso ASP.NET Development Server Não Funciona?</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/15/o-vosso-asp-net-development-server-n-227-o-funciona.aspx</link><pubDate>Tue, 15 Jun 2010 00:49:00 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:60751</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><description>&lt;P align=justify&gt;Desde o &lt;A title="Visual Studio 2005 Editions" href="http://www.microsoft.com/visualstudio/en-us/products/2005-editions" target=_blank&gt;&lt;STRONG&gt;Visual Studio 2005&lt;/STRONG&gt;&lt;/A&gt;, que o &lt;A title="Visual Studio" href="http://www.microsoft.com/visualstudio/" target=_blank&gt;&lt;STRONG&gt;Visual Studio&lt;/STRONG&gt;&lt;/A&gt; traz um servidor web de desenvolvimento: o &lt;A title="Web Servers in Visual Web Developer" href="http://msdn.microsoft.com/library/58wxa9w5.aspx" target=_blank&gt;&lt;STRONG&gt;ASP.NET Development Server&lt;/STRONG&gt;&lt;/A&gt;.&lt;/P&gt;
&lt;P align=justify&gt;Tenho usado, desde então, este servidor web para projectos de teste simples com o &lt;A title="Visual Studio 2005 Editions" href="http://www.microsoft.com/visualstudio/en-us/products/2005-editions" target=_blank&gt;&lt;STRONG&gt;Visual Studio 2005&lt;/STRONG&gt;&lt;/A&gt; e o &lt;A title="Visual Studio 2008 Editions" href="http://www.microsoft.com/visualstudio/en-us/products/2008-editions" target=_blank&gt;&lt;STRONG&gt;Visual Studio 2008&lt;/STRONG&gt;&lt;/A&gt; em &lt;A title="Microsoft Windows XP" href="http://www.microsoft.com/windows/windows-xp/" target=_blank&gt;&lt;STRONG&gt;Windows XP&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; Professional&lt;/STRONG&gt; no laptop do trabalho e em &lt;STRONG&gt;&lt;A title="Microsoft Windows XP" href="http://www.microsoft.com/windows/windows-xp/" target=_blank&gt;&lt;STRONG&gt;Windows XP&lt;/STRONG&gt;&lt;/A&gt; Professional&lt;/STRONG&gt;, &lt;A title="Microsoft Windows Vista" href="https://www.microsoft.com/windows/windows-vista/" target=_blank&gt;&lt;STRONG&gt;Windows Vista&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; 64bit Ultimate&lt;/STRONG&gt; e &lt;A title="Microsoft Windows 7" href="http://www.microsoft.com/windows/windows-7/" target=_blank&gt;&lt;STRONG&gt;Windows 7&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; 64bit Ultimate&lt;/STRONG&gt; no desktop de casa sem qualquer problema (além do &lt;A title="BUG: Usar identidades à medida em ASP.NET dá erro quando se uso o ASP.NET Developement Server" href="http://paulomorgado.net/pt/blog/archive/2007/04/29/P13996.aspx" target=_blank&gt;conhecido problema com custom identities&lt;/A&gt;, quero dizer).&lt;/P&gt;
&lt;P align=justify&gt;Quando recebi um novo laptop no trabalho, instalei o &lt;A title="Microsoft Windows Vista" href="https://www.microsoft.com/windows/windows-vista/" target=_blank&gt;&lt;STRONG&gt;Windows Vista&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; 64bit Enterprise&lt;/STRONG&gt; e o &lt;A title="Visual Studio 2008 Editions" href="http://www.microsoft.com/visualstudio/en-us/products/2008-editions" target=_blank&gt;&lt;STRONG&gt;Visual Studio 2008&lt;/STRONG&gt;&lt;/A&gt; e, para grande surpresa minha, o&lt;A title="Web Servers in Visual Web Developer" href="http://msdn.microsoft.com/library/58wxa9w5.aspx" target=_blank&gt;&lt;STRONG&gt;ASP.NET Development Server&lt;/STRONG&gt;&lt;/A&gt; não funcionava.&lt;/P&gt;
&lt;P align=justify&gt;Comecei a procurar diferenças entre os dois sistemas e as mais notórias eram:&lt;/P&gt;
&lt;P align=center&gt;
&lt;TABLE cellSpacing=0 cellPadding=2&gt;

&lt;TR&gt;
&lt;TD&gt;
&lt;P align=center&gt;&lt;STRONG&gt;Sistema&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P align=center&gt;&lt;STRONG&gt;Laptop&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P align=center&gt;&lt;STRONG&gt;Desktop&lt;/STRONG&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P align=left&gt;SKU&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P align=center&gt;Windows Vista 64bit Enterprise&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P align=center&gt;Windows Vista 64bit Ultimate&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P align=left&gt;Pertencente a um domínio&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P align=center&gt;SIM&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P align=center&gt;Não&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P align=left&gt;Anti-Vírus&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P align=center&gt;&lt;A title="McAfee – Antivirus, Encryption, DLP, IPS, Firewall, Email Security, Web Security, SaaS, Risk and Compliance Solutions" href="http://www.mcafee.com/" target=_blank&gt;McAffe&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;
&lt;TD&gt;
&lt;P align=center&gt;&lt;A title="ESET - Antivirus Software with Spyware and Malware Protection" href="http://www.eset.com/" target=_blank&gt;ESET&lt;/A&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TABLE&gt;&lt;/P&gt;
&lt;P align=justify&gt;Depois de me certificar que nenhuma política de domínio estava a ser aplicada ao laptop ou ao meu utilizador e de que nada estava a ser registado pelo anti-vírus, as minhas suspeitas penderam para o facto de o laptop estar uma correr uma SKU Enterprise e o desktop estar a correr uma SKU Ultimate. Depois de ter tido alguns problemas com outras aplicações, tinha a certeza de que o problema era a SKU Enterprise, mas nunca encontrei uma solução para o problema. Porque, na altura, não estava a desenvolver para web, deixei estar.&lt;/P&gt;
&lt;P align=justify&gt;Depois de actualizar para o &lt;A title="Microsoft Windows 7" href="http://www.microsoft.com/windows/windows-7/" target=_blank&gt;&lt;STRONG&gt;Windows 7&lt;/STRONG&gt;&lt;/A&gt;, o problema persistiu. Mas, porque, na altura, não estava a desenvolver para web, deixei estar – outra vez.&lt;/P&gt;
&lt;P align=justify&gt;Qgora que instalei o &lt;A title="Visual Studio 2010 Editions" href="http://www.microsoft.com/visualstudio/en-us/products/2010-editions" target=_blank&gt;&lt;STRONG&gt;Visual Studio 2010&lt;/STRONG&gt;&lt;/A&gt;, tinha de resolver o problema. Depois de pesquisar alguns forums e alguns blogues que, ou não ofereciam alguma solução, ou ofereciam soluções demaisado complicadas envolvendo, em alguns casos, mexidas no &lt;EM&gt;registry&lt;/EM&gt;, cheguei à conclusão de que a solução até era muito simples.&lt;/P&gt;
&lt;P align=justify&gt;Quando o &lt;A title="Microsoft Windows Vista" href="https://www.microsoft.com/windows/windows-vista/" target=_blank&gt;&lt;STRONG&gt;Windows Vista&lt;/STRONG&gt;&lt;/A&gt; é instalado, o ficheiro &lt;STRONG&gt;hosts&lt;/STRONG&gt;, de acordo com &lt;A title="Como posso repor a predefinição do ficheiro hosts?" href="http://support.microsoft.com/kb/972034" target=_blank&gt;isto&lt;/A&gt;, contem a seguinte definição:&lt;/P&gt;&lt;PRE style="MARGIN-LEFT:5em;MARGIN-RIGHT:5em;" class=code&gt;127.0.0.1       localhost
::1             localhost&lt;/PRE&gt;
&lt;P align=justify&gt;Isto não era o que eu tinha no meu ficheiro &lt;STRONG&gt;hosts&lt;/STRONG&gt; do laptop. O que eu tinha era isto:&lt;/P&gt;&lt;PRE style="MARGIN-LEFT:5em;MARGIN-RIGHT:5em;" class=code&gt;#127.0.0.1       localhost
#::1             localhost&lt;/PRE&gt;
&lt;P&gt;Posso ter sido eu mesmo a modificá-lo, mas pelo número de pessoas que encontrei queixando-se do mesmo problema no &lt;A title="Microsoft Windows Vista" href="https://www.microsoft.com/windows/windows-vista/" target=_blank&gt;&lt;STRONG&gt;Windows Vista&lt;/STRONG&gt;&lt;/A&gt;, provavelmente, era isto mesmo que tinha sido lá deixado pela instalação.&lt;/P&gt;
&lt;P&gt;A instalação do &lt;A title="Microsoft Windows 7" href="http://www.microsoft.com/windows/windows-7/" target=_blank&gt;&lt;STRONG&gt;Windows 7&lt;/STRONG&gt;&lt;/A&gt; deixam o ficheiro &lt;STRONG&gt;hosts&lt;/STRONG&gt; com isto:&lt;/P&gt;&lt;PRE style="MARGIN-LEFT:5em;MARGIN-RIGHT:5em;" class=code&gt;#127.0.0.1       localhost
#::1             localhost&lt;/PRE&gt;
&lt;P&gt;Apesar do &lt;A title="Web Servers in Visual Web Developer" href="http://msdn.microsoft.com/library/58wxa9w5.aspx" target=_blank&gt;&lt;STRONG&gt;ASP.NET Development Server&lt;/STRONG&gt;&lt;/A&gt; funcionar correctamente no &lt;A title="Microsoft Windows 7" href="http://www.microsoft.com/windows/windows-7/" target=_blank&gt;&lt;STRONG&gt;Windows 7&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; 64bit Ultimate&lt;/STRONG&gt;, no &lt;A title="Microsoft Windows 7" href="http://www.microsoft.com/windows/windows-7/" target=_blank&gt;&lt;STRONG&gt;Windows 7&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; 64bit Enterprise &lt;/STRONG&gt;necessita que o ficheiro &lt;STRONG&gt;hosts &lt;/STRONG&gt;tenha a seguinte definição:&lt;/P&gt;&lt;PRE style="MARGIN-LEFT:5em;MARGIN-RIGHT:5em;" class=code&gt;127.0.0.1       localhost
::1             localhost&lt;/PRE&gt;
&lt;P&gt;E suspeito que o mesmo seja necessário para o &lt;A title="Microsoft Windows Vista" href="https://www.microsoft.com/windows/windows-vista/" target=_blank&gt;&lt;STRONG&gt;Windows Vista&lt;/STRONG&gt;&lt;/A&gt;&lt;STRONG&gt; 64bit Enterprise&lt;/STRONG&gt;.&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/15/o-vosso-asp-net-development-server-n-227-o-funciona.aspx&amp;amp;;subject=O+Vosso+ASP.NET+Development+Server+N%26%23227%3bo+Funciona%3f" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/15/o-vosso-asp-net-development-server-n-227-o-funciona.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/15/o-vosso-asp-net-development-server-n-227-o-funciona.aspx&amp;amp;;title=O+Vosso+ASP.NET+Development+Server+N%26%23227%3bo+Funciona%3f" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/15/o-vosso-asp-net-development-server-n-227-o-funciona.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/15/o-vosso-asp-net-development-server-n-227-o-funciona.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/15/o-vosso-asp-net-development-server-n-227-o-funciona.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/15/o-vosso-asp-net-development-server-n-227-o-funciona.aspx&amp;amp;title=O+Vosso+ASP.NET+Development+Server+N%26%23227%3bo+Funciona%3f" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/15/o-vosso-asp-net-development-server-n-227-o-funciona.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/15/o-vosso-asp-net-development-server-n-227-o-funciona.aspx&amp;amp;;title=O+Vosso+ASP.NET+Development+Server+N%26%23227%3bo+Funciona%3f" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/15/o-vosso-asp-net-development-server-n-227-o-funciona.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/15/o-vosso-asp-net-development-server-n-227-o-funciona.aspx&amp;amp;;title=O+Vosso+ASP.NET+Development+Server+N%26%23227%3bo+Funciona%3f&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/06/15/o-vosso-asp-net-development-server-n-227-o-funciona.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=60751" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/VisualStudio/default.aspx">VisualStudio</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Windows/default.aspx">Windows</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/VisualStudio2008/default.aspx">VisualStudio2008</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/WindowsVista/default.aspx">WindowsVista</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Windows7/default.aspx">Windows7</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/VisualStudio2010/default.aspx">VisualStudio2010</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/VisualStudio2005/default.aspx">VisualStudio2005</category></item><item><title>Microsoft Live Labs Pivot</title><link>http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/microsoft-live-labs-pivot.aspx</link><pubDate>Fri, 14 May 2010 15:07:43 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:60472</guid><dc:creator>João Pedro Martins</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;I’ve been trying out Pivot in the last few days, downloaded from &lt;a href="http://www.getpivot.com/"&gt;here&lt;/a&gt;. Pretty amazing thing, crossing the power of DeepZoom with structured information. I can’t help but imagine the application of these technologies to information stored in business databases, intranets, or even as a navigation metaphor in your computer/file system or code. There will be a Silverlight version this year, and there’s an Excel Add-In to generate the custom Xml that feeds the system.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/microsoft-live-labs-pivot.aspx&amp;amp;;subject=Microsoft+Live+Labs+Pivot" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/microsoft-live-labs-pivot.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/microsoft-live-labs-pivot.aspx&amp;amp;;title=Microsoft+Live+Labs+Pivot" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/microsoft-live-labs-pivot.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/microsoft-live-labs-pivot.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/microsoft-live-labs-pivot.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/microsoft-live-labs-pivot.aspx&amp;amp;title=Microsoft+Live+Labs+Pivot" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/microsoft-live-labs-pivot.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/microsoft-live-labs-pivot.aspx&amp;amp;;title=Microsoft+Live+Labs+Pivot" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/microsoft-live-labs-pivot.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/microsoft-live-labs-pivot.aspx&amp;amp;;title=Microsoft+Live+Labs+Pivot&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/microsoft-live-labs-pivot.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=60472" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/tags/Information+Presentation/default.aspx">Information Presentation</category></item><item><title>IASA’s CITA-P certification replaces Microsoft MCA</title><link>http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/iasa-s-cita-p-certification-replaces-microsoft-mca.aspx</link><pubDate>Fri, 14 May 2010 09:57:37 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:60468</guid><dc:creator>João Pedro Martins</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;As reported by &lt;a href="http://www.iasahome.org/web/home/mcagrandfather"&gt;IASA&lt;/a&gt;, the Certified IT Architect at the Professional Level (&lt;strong&gt;CITA-P&lt;/strong&gt;) has now replaced Microsoft’s Certified Architect (&lt;strong&gt;MCA&lt;/strong&gt;) program. The information about the new certification can be found &lt;a href="http://www.iasahome.org/web/home/certification"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;A curiosity: «&lt;em&gt;In the six years of the MCA program, 113 solutions and infrastructure architects completed the certification. The CITA-P adoption path has been much quicker as 23 IT Architects have already gone through the certification. With the MCA grandfathering, upcoming boards scheduled in Ireland, India, and the US, IASA expects to double that number this calendar year&lt;/em&gt;.»&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/iasa-s-cita-p-certification-replaces-microsoft-mca.aspx&amp;amp;;subject=IASA%e2%80%99s+CITA-P+certification+replaces+Microsoft+MCA" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/iasa-s-cita-p-certification-replaces-microsoft-mca.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/iasa-s-cita-p-certification-replaces-microsoft-mca.aspx&amp;amp;;title=IASA%e2%80%99s+CITA-P+certification+replaces+Microsoft+MCA" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/iasa-s-cita-p-certification-replaces-microsoft-mca.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/iasa-s-cita-p-certification-replaces-microsoft-mca.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/iasa-s-cita-p-certification-replaces-microsoft-mca.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/iasa-s-cita-p-certification-replaces-microsoft-mca.aspx&amp;amp;title=IASA%e2%80%99s+CITA-P+certification+replaces+Microsoft+MCA" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/iasa-s-cita-p-certification-replaces-microsoft-mca.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/iasa-s-cita-p-certification-replaces-microsoft-mca.aspx&amp;amp;;title=IASA%e2%80%99s+CITA-P+certification+replaces+Microsoft+MCA" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/iasa-s-cita-p-certification-replaces-microsoft-mca.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/iasa-s-cita-p-certification-replaces-microsoft-mca.aspx&amp;amp;;title=IASA%e2%80%99s+CITA-P+certification+replaces+Microsoft+MCA&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/2010/05/14/iasa-s-cita-p-certification-replaces-microsoft-mca.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=60468" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/joaomartins/archive/tags/Arquitectura/default.aspx">Arquitectura</category></item><item><title>Como Detectar As Definições Regionais A Partir Do Web Browser</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/05/11/como-detectar-as-defini-231-245-es-regionais-a-partir-do-web-browser.aspx</link><pubDate>Tue, 11 May 2010 00:52:00 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:60382</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><description>&lt;P align=justify&gt;Recentemente um amigo perguntou-me algo como: “Como é que obtenho as definições regionais de um pedido a um &lt;EM&gt;web server&lt;/EM&gt;?”&lt;/P&gt;
&lt;P align=justify&gt;Tanto quanto sei, o &lt;EM&gt;web browser&lt;/EM&gt; apenas envia o &lt;EM&gt;header&lt;/EM&gt; HTTP only &lt;A title="Accept-Language HTTP Header" href="http://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-02.html#Accept_Language" target=_blank&gt;Accept-Language&lt;/A&gt; e nada mais. Pode-se pegar nesta informação e usar as definições regionais por omissão, mas se o utilizador for como eu, estarão erradas.&lt;/P&gt;
&lt;H4&gt;E qual é o problema de não acertar com as definições regionais do cliente?&lt;/H4&gt;
&lt;P align=justify&gt;Se se estivermos apenas a gerar HTML e mantivermos a coerência, não há qualquer problema. Mas, e se o utilizador quiser copiar valores numéricos e/ou datas/horas para, por exemplo, um folha &lt;A title="Microsoft Office Excel" href="http://office.microsoft.com/excel/" target=_blank&gt;Excel&lt;/A&gt;? Ou se se quiser exportar os dados para um ficheiro em formato &lt;A title="Comma-separated values" href="http://wikipedia.org/wiki/Comma-separated_values" target=_blank&gt;CSV&lt;/A&gt;?&lt;/P&gt;
&lt;H4&gt;Uma solução&lt;/H4&gt;
&lt;P align=justify&gt;Consultando a &lt;A title="JScript Language Reference (Windows Scripting - JScript)" href="http://msdn.microsoft.com/library/yek4tbz0.aspx" target=_blank&gt;JScript Language Reference&lt;/A&gt;, descobri que tanto &lt;A title="Number Object (Windows Scripting - JScript)" href="http://msdn.microsoft.com/library/dwab3ed2.aspx" target=_blank&gt;Number&lt;/A&gt; com &lt;A title="Date Object (Windows Scripting - JScript)" href="http://msdn.microsoft.com/library/cd9w2te4.aspx" target=_blank&gt;Date&lt;/A&gt; têm métodos &lt;STRONG&gt;toString&lt;/STRONG&gt; relacionados com &lt;STRONG&gt;locale&lt;/STRONG&gt; e comecei a experimentá-los.&lt;/P&gt;
&lt;H5&gt;Definições de formatos numéricos&lt;/H5&gt;
&lt;P align=justify&gt;Para os formatos numéricos, primeiro necessitamos de um número que se comporte de forma previsíve em com qualquer cultura (“qualquer cultura” significa “qualquer cultura que eu conheça”) e todas as definições possíveis e convertê-lo para &lt;STRONG&gt;string&lt;/STRONG&gt; usando o método &lt;A title="toLocaleString Method (Windows Scripting - JScript)" href="http://msdn.microsoft.com/library/wb66sb9s.aspx" target=_blank&gt;toLocaleString&lt;/A&gt;:&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;number = 111111111.111111111;
&lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;numberString = number.toLocaleString();&lt;/PRE&gt;
&lt;P align=justify&gt;&lt;A href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;(Com as minhas definições regionais, &lt;STRONG&gt;numberString&lt;/STRONG&gt; terá o valor &lt;STRONG style="WHITE-SPACE:nowrap;"&gt;111 111 111.11&lt;/STRONG&gt;)&lt;/P&gt;
&lt;P align=justify&gt;Para obter o separador decimal, temos de obter o primeiro carácter, a partir do fim, que não seja &lt;STRONG&gt;1&lt;/STRONG&gt;:&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;decimalSeparator;
&lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;decimalDigits;
&lt;SPAN style="COLOR:blue;"&gt;for &lt;/SPAN&gt;(&lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;i = numberString.length - 1; i &amp;gt;= 0; i--) {
    &lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;char = numberString.charAt(i);
    &lt;SPAN style="COLOR:blue;"&gt;if &lt;/SPAN&gt;(char != &lt;SPAN style="COLOR:maroon;"&gt;"1"&lt;/SPAN&gt;) {
        decimalSeparator = char;
        decimalDigits = numberString.length - i - 1;
        &lt;SPAN style="COLOR:blue;"&gt;break&lt;/SPAN&gt;;
    }
}&lt;/PRE&gt;
&lt;P align=justify&gt;&lt;A href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;Se se contarem quantos &lt;STRONG&gt;1&lt;/STRONG&gt;s saltámos, obtme-se o número de casas décimais.&lt;/P&gt;
&lt;P align=justify&gt;Do mesmo modo, o primeiro carácter, a contar do início, que não seja &lt;STRONG&gt;1&lt;/STRONG&gt; é o separador de grupos:&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;groupSeparator;
&lt;SPAN style="COLOR:blue;"&gt;for &lt;/SPAN&gt;(&lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;i = 0; i &amp;lt; numberString.length; i++) {
    &lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;char = numberString.charAt(i);
    &lt;SPAN style="COLOR:blue;"&gt;if &lt;/SPAN&gt;(char != &lt;SPAN style="COLOR:maroon;"&gt;"1"&lt;/SPAN&gt;) {
        groupSeparator = char;
        &lt;SPAN style="COLOR:blue;"&gt;break&lt;/SPAN&gt;;
    }
}&lt;/PRE&gt;
&lt;P align=justify&gt;Tendo obitod o separador de grupos, podemos obter a composição dos mesmos (podem não ter todos o mesmo número de dígitos):&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;digitGrouping = numberString.substring(0, numberString.length - decimalDigits - 1).split(groupSeparator);
&lt;SPAN style="COLOR:blue;"&gt;for &lt;/SPAN&gt;(g &lt;SPAN style="COLOR:blue;"&gt;in &lt;/SPAN&gt;digitGrouping) {
    digitGrouping[g] = digitGrouping[g].length;
}&lt;/PRE&gt;
&lt;H5&gt;Definições de data e hora&lt;/H5&gt;
&lt;P&gt;Os valores de data e hora são mais difíceis de interpretar e podem não ser necessárias todas as definições, por isso, vou-vos deixar este como exercício:&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;dateTime = &lt;SPAN style="COLOR:blue;"&gt;new &lt;/SPAN&gt;Date(9999, 11, 31, 23, 30, 45);
dateTimeString = dateTime.toLocaleString();&lt;/PRE&gt;
&lt;H5&gt;Definições de listas&lt;/H5&gt;
&lt;P&gt;A última definição é a do separador de listas (muito útil para os tais ficheiros &lt;STRONG&gt;CSV&lt;/STRONG&gt;):&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;list = [&lt;SPAN style="COLOR:maroon;"&gt;"a"&lt;/SPAN&gt;, &lt;SPAN style="COLOR:maroon;"&gt;"b"&lt;/SPAN&gt;];
listSeparator = list.toLocaleString().substring(1, 2);&lt;/PRE&gt;
&lt;H4&gt;Página de testes&lt;/H4&gt;
&lt;P&gt;Aqui está uma página de testes para testar todas estas definições:&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;lt;!&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;DOCTYPE &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;HTML PUBLIC &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;"-//W3C//DTD HTML 4.0 Transitional//EN"&amp;gt;
&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;html&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;
&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;head&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;title&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;Test Page&lt;SPAN style="COLOR:blue;"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;title&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;style &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;type&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;="text/css"&amp;gt;
        &lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;label  &lt;/SPAN&gt;{ &lt;SPAN style="COLOR:red;"&gt;width&lt;/SPAN&gt;: &lt;SPAN style="COLOR:blue;"&gt;8em&lt;/SPAN&gt;; &lt;SPAN style="COLOR:red;"&gt;text-align&lt;/SPAN&gt;: &lt;SPAN style="COLOR:blue;"&gt;right&lt;/SPAN&gt;; &lt;SPAN style="COLOR:red;"&gt;padding-right&lt;/SPAN&gt;: &lt;SPAN style="COLOR:blue;"&gt;0.5em&lt;/SPAN&gt;; &lt;SPAN style="COLOR:red;"&gt;white-space&lt;/SPAN&gt;: &lt;SPAN style="COLOR:blue;"&gt;nowrap&lt;/SPAN&gt;; }
        &lt;SPAN style="COLOR:maroon;"&gt;span &lt;/SPAN&gt;{ &lt;SPAN style="COLOR:red;"&gt;border&lt;/SPAN&gt;: &lt;SPAN style="COLOR:blue;"&gt;1px solid&lt;/SPAN&gt;; &lt;SPAN style="COLOR:red;"&gt;white-space&lt;/SPAN&gt;: &lt;SPAN style="COLOR:blue;"&gt;nowrap&lt;/SPAN&gt;; }
    &lt;SPAN style="COLOR:blue;"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;style&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;script &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;type&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;="text/javascript"&amp;gt;
        function &lt;/SPAN&gt;init() {
            document.all.userLanguage.innerText = window.navigator.userLanguage;
            document.all.systemLanguage.innerText = window.navigator.systemLanguage;

            &lt;SPAN style="COLOR:#006400;"&gt;// Decimal separator and decimal digits
            &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;number = 111111111.111111111;
            &lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;numberString = (111111111.111111111).toLocaleString();

            &lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;decimalSeparator;
            &lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;decimalDigits;
            &lt;SPAN style="COLOR:blue;"&gt;for &lt;/SPAN&gt;(&lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;i = numberString.length - 1; i &amp;gt;= 0; i--) {
                &lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;char = numberString.charAt(i);
                &lt;SPAN style="COLOR:blue;"&gt;if &lt;/SPAN&gt;(char != &lt;SPAN style="COLOR:maroon;"&gt;"1"&lt;/SPAN&gt;) {
                    decimalSeparator = char;
                    decimalDigits = numberString.length - i - 1;
                    &lt;SPAN style="COLOR:blue;"&gt;break&lt;/SPAN&gt;;
                }
            }
            document.all.decimalSeparator.innerText = decimalSeparator;
            document.all.decimalDigits.innerText = decimalDigits;

            &lt;SPAN style="COLOR:#006400;"&gt;// Digit grouping separator and digit goups
            &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;groupSeparator;
            &lt;SPAN style="COLOR:blue;"&gt;for &lt;/SPAN&gt;(&lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;i = 0; i &amp;lt; numberString.length; i++) {
                &lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;char = numberString.charAt(i);
                &lt;SPAN style="COLOR:blue;"&gt;if &lt;/SPAN&gt;(char != &lt;SPAN style="COLOR:maroon;"&gt;"1"&lt;/SPAN&gt;) {
                    groupSeparator = char;
                    &lt;SPAN style="COLOR:blue;"&gt;break&lt;/SPAN&gt;;
                }
            }
            document.all.groupSeparator.innerText = groupSeparator;

            &lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;digitGrouping = numberString.substring(0, numberString.length - decimalDigits - 1).split(groupSeparator);
            &lt;SPAN style="COLOR:blue;"&gt;for &lt;/SPAN&gt;(g &lt;SPAN style="COLOR:blue;"&gt;in &lt;/SPAN&gt;digitGrouping) {
                digitGrouping[g] = digitGrouping[g].length;
            }
            document.all.digitGrouping.innerText = digitGrouping.toString();

            &lt;SPAN style="COLOR:#006400;"&gt;// Date format
            &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;dateTime = &lt;SPAN style="COLOR:blue;"&gt;new &lt;/SPAN&gt;Date(9999, 11, 31, 23, 30, 45);
            &lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;dateTimeString = dateTime.toLocaleString();
            document.all.dateTimeFormat.innerText = dateTimeString;

            &lt;SPAN style="COLOR:#006400;"&gt;// List separator
            &lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;list = [&lt;SPAN style="COLOR:maroon;"&gt;"a"&lt;/SPAN&gt;, &lt;SPAN style="COLOR:maroon;"&gt;"b"&lt;/SPAN&gt;];
            &lt;SPAN style="COLOR:blue;"&gt;var &lt;/SPAN&gt;listSeparator = list.toLocaleString().substring(1, 2);
            document.all.listSeparator.innerText = listSeparator;
        }
    &lt;SPAN style="COLOR:blue;"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;script&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;head&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;
&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;body &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;onload&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;="init()"&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;label &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;for&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;="userLanguage"&amp;gt;&lt;/SPAN&gt;User language:&lt;SPAN style="COLOR:blue;"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;label&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;span &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;id&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;="userLanguage"&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;span&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;label &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;for&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;="systemLanguage"&amp;gt;&lt;/SPAN&gt;System language:&lt;SPAN style="COLOR:blue;"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;label&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;span &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;id&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;="systemLanguage"&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;span&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;label &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;for&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;="decimalSeparator"&amp;gt;&lt;/SPAN&gt;Decimal separator:&lt;SPAN style="COLOR:blue;"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;label&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;span &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;id&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;="decimalSeparator"&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;span&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;label &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;for&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;="decimalDigits"&amp;gt;&lt;/SPAN&gt;Decimal digits:&lt;SPAN style="COLOR:blue;"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;label&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;span &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;id&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;="decimalDigits"&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;span&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;label &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;for&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;="groupSeparator"&amp;gt;&lt;/SPAN&gt;Digit separator:&lt;SPAN style="COLOR:blue;"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;label&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;span &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;id&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;="groupSeparator"&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;span&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;label &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;for&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;="digitGrouping"&amp;gt;&lt;/SPAN&gt;Digit grouping:&lt;SPAN style="COLOR:blue;"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;label&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;span &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;id&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;="digitGrouping"&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;span&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;label &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;for&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;="dateTimeFormat"&amp;gt;&lt;/SPAN&gt;Date/Time format:&lt;SPAN style="COLOR:blue;"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;label&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;span &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;id&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;="dateTimeFormat"&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;span&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;label &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;for&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;="listSeparator"&amp;gt;&lt;/SPAN&gt;List separator:&lt;SPAN style="COLOR:blue;"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;label&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;span &lt;/SPAN&gt;&lt;SPAN style="COLOR:red;"&gt;id&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;="listSeparator"&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;span&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;p&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;body&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR:maroon;"&gt;html&lt;/SPAN&gt;&lt;SPAN style="COLOR:blue;"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/05/11/como-detectar-as-defini-231-245-es-regionais-a-partir-do-web-browser.aspx&amp;amp;;subject=Como+Detectar+As+Defini%26%23231%3b%26%23245%3bes+Regionais+A+Partir+Do+Web+Browser" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/05/11/como-detectar-as-defini-231-245-es-regionais-a-partir-do-web-browser.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/05/11/como-detectar-as-defini-231-245-es-regionais-a-partir-do-web-browser.aspx&amp;amp;;title=Como+Detectar+As+Defini%26%23231%3b%26%23245%3bes+Regionais+A+Partir+Do+Web+Browser" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/05/11/como-detectar-as-defini-231-245-es-regionais-a-partir-do-web-browser.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/05/11/como-detectar-as-defini-231-245-es-regionais-a-partir-do-web-browser.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/05/11/como-detectar-as-defini-231-245-es-regionais-a-partir-do-web-browser.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/05/11/como-detectar-as-defini-231-245-es-regionais-a-partir-do-web-browser.aspx&amp;amp;title=Como+Detectar+As+Defini%26%23231%3b%26%23245%3bes+Regionais+A+Partir+Do+Web+Browser" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/05/11/como-detectar-as-defini-231-245-es-regionais-a-partir-do-web-browser.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/05/11/como-detectar-as-defini-231-245-es-regionais-a-partir-do-web-browser.aspx&amp;amp;;title=Como+Detectar+As+Defini%26%23231%3b%26%23245%3bes+Regionais+A+Partir+Do+Web+Browser" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/05/11/como-detectar-as-defini-231-245-es-regionais-a-partir-do-web-browser.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/05/11/como-detectar-as-defini-231-245-es-regionais-a-partir-do-web-browser.aspx&amp;amp;;title=Como+Detectar+As+Defini%26%23231%3b%26%23245%3bes+Regionais+A+Partir+Do+Web+Browser&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/05/11/como-detectar-as-defini-231-245-es-regionais-a-partir-do-web-browser.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=60382" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Desenvolvimento/default.aspx">Desenvolvimento</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/InternetExplorer/default.aspx">InternetExplorer</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/JavaScript/default.aspx">JavaScript</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Internet/default.aspx">Internet</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TipsAndTricks/default.aspx">TipsAndTricks</category></item><item><title>Novo Livro Do Luís Abreu: ASP.NET 4.0 – Curso Completo</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/26/novo-livro-do-lu-237-s-abreu-asp-net-4-0-curso-completo.aspx</link><pubDate>Mon, 26 Apr 2010 01:00:00 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:58606</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><description>&lt;A title="LINQ Com C#" href="http://www.fca.pt/cgi-bin/fca_main.cgi/?isbn=978-972-722-653-5&amp;amp;op=2" 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="ASP.NET 4.0 – Curso Completo" border=0 alt="ASP.NET 4.0 – Curso Completo" align=right src="http://www.fca.pt/ximages/978-972-722-653-5.gif" width=99 height=140&gt;&lt;/A&gt; 
&lt;P align=justify&gt;Este livro, com vários exemplos práticos, apresenta as principais características relacionadas com a construção de aplicações &lt;I&gt;Web&lt;/I&gt; através da &lt;B&gt;nova plataforma da Microsoft, ASP.NET 4.0.&lt;/B&gt; Inicia com a apresentação da &lt;I&gt;framework&lt;/I&gt; que serve de suporte ao desenvolvimento de páginas (&lt;I&gt;Web forms&lt;/I&gt; e ASP.NET &lt;I&gt;server controls simples&lt;/I&gt;) e introduz gradualmente todas as novas funcionalidades disponibilizadas.&lt;/P&gt;
&lt;P align=justify&gt;Mais compacta do que as suas antecessoras (parte do conteúdo foi movido para o para o sítio da &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; na forma de apêndices), esta nova obra, em que foi dado ênfase às novas funcionalidades da recente versão 4.0, tem como objectivo ensinar o programador que se está a iniciar na plataforma ASP.NET, sendo também uma ferramenta indispensável para o programador conhecedor da &lt;I&gt;framework&lt;/I&gt; ASP.NET que pretenda fazer a transição para a nova versão.&lt;/P&gt;
&lt;P align=justify&gt;Desta vez há boas notícias para os leitures Brasileiros. O livro vai ser distribuído no Brasil por:&lt;/P&gt;
&lt;P style="PADDING-LEFT:2em;"&gt;Zamboni Comércio de Livros Ltda. &lt;BR&gt;Av.Parada Pinto, 1476 &lt;BR&gt;São Paulo – SP &lt;BR&gt;Telf. / Fax: +55 11 2233-2333 &lt;BR&gt;E-mail: &lt;A href="mailto:zambonibooks@terra.com.br"&gt;zambonibooks@terra.com.br&lt;/A&gt;&lt;/P&gt;&lt;A title="LINQ Com C#" 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#" border=0 alt="LINQ Com C#" align=right src="http://www.fca.pt/ximages/722_547.gif" width=99 height=140&gt;&lt;/A&gt; 
&lt;P&gt;O nosso livro (&lt;A title="LINQ Com C#" href="http://bit.ly/Livro-LINQ-Com-Charp" target=_blank&gt;LINQ Com C#&lt;/A&gt;) ainda não é distribuído por este distribuidor mas podem sempre contactá-lo para ver se é possível obtê-lo através dele.&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/26/novo-livro-do-lu-237-s-abreu-asp-net-4-0-curso-completo.aspx&amp;amp;;subject=Novo+Livro+Do+Lu%26%23237%3bs+Abreu%3a+ASP.NET+4.0+%e2%80%93+Curso+Completo" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/26/novo-livro-do-lu-237-s-abreu-asp-net-4-0-curso-completo.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/26/novo-livro-do-lu-237-s-abreu-asp-net-4-0-curso-completo.aspx&amp;amp;;title=Novo+Livro+Do+Lu%26%23237%3bs+Abreu%3a+ASP.NET+4.0+%e2%80%93+Curso+Completo" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/26/novo-livro-do-lu-237-s-abreu-asp-net-4-0-curso-completo.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/26/novo-livro-do-lu-237-s-abreu-asp-net-4-0-curso-completo.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/26/novo-livro-do-lu-237-s-abreu-asp-net-4-0-curso-completo.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/26/novo-livro-do-lu-237-s-abreu-asp-net-4-0-curso-completo.aspx&amp;amp;title=Novo+Livro+Do+Lu%26%23237%3bs+Abreu%3a+ASP.NET+4.0+%e2%80%93+Curso+Completo" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/26/novo-livro-do-lu-237-s-abreu-asp-net-4-0-curso-completo.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/26/novo-livro-do-lu-237-s-abreu-asp-net-4-0-curso-completo.aspx&amp;amp;;title=Novo+Livro+Do+Lu%26%23237%3bs+Abreu%3a+ASP.NET+4.0+%e2%80%93+Curso+Completo" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/26/novo-livro-do-lu-237-s-abreu-asp-net-4-0-curso-completo.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/26/novo-livro-do-lu-237-s-abreu-asp-net-4-0-curso-completo.aspx&amp;amp;;title=Novo+Livro+Do+Lu%26%23237%3bs+Abreu%3a+ASP.NET+4.0+%e2%80%93+Curso+Completo&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/26/novo-livro-do-lu-237-s-abreu-asp-net-4-0-curso-completo.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=58606" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Livros/default.aspx">Livros</category></item><item><title>TechDays 2010: As Novidades Do C# 4.0</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/23/techdays-2010-as-novidades-do-c-4-0.aspx</link><pubDate>Fri, 23 Apr 2010 00:32:34 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:58408</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><description>&lt;p align="justify"&gt;Gostaria de agradecer a quem esteve presente na minha sessão no &lt;a title="TechDays 2010" href="http://www.techdays2010.com/" target="_blank"&gt;TechDays 2010&lt;/a&gt; e espero que tenha conseguido passar a mensagem das novidades da última versão da linguagem &lt;a title="Microsoft Visual C#" href="http://csharp.net/" target="_blank"&gt;C#&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Para quem não esteve na sessão (ou esteve e quiser rever o conteúdo), a apresentação pode ser descarregada &lt;a title="As Novidades Do C# 4.0" href="http://www.slideshare.net/PauloJorgeMorgado/as-novidades-do-c-40" target="_blank"&gt;daqui&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Os exemplos de código podem ser descarregados &lt;a title="TechDays 2010 - What&amp;#39;s New In C# 4.0" href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=PauloMorgado&amp;amp;DownloadId=10348" target="_blank"&gt;daqui&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Aqui fica também a lista dos recursos mencionados na apresentação:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;A Evolução Do C#&lt;/li&gt;    &lt;ul&gt;     &lt;li&gt;&lt;a title="A Evolução Do C#" href="http://paulomorgado.net/pt/blog/archive/2010/04/12/a-evolu-231-227-o-do-c.aspx" target="_blank"&gt;A Evolução Do C#&lt;/a&gt;&lt;/li&gt;   &lt;/ul&gt;    &lt;li&gt;Covariância e Contravariância      &lt;ul&gt;       &lt;li&gt;&lt;a title="Covariância E Contravariância Em Genéricos" href="http://paulomorgado.net/pt/blog/archive/2010/04/13/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos.aspx" target="_blank"&gt;Covariância E Contravariância Em Genéricos&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a title="Covariância E Contravariância Em Genéricos – Simplificado" href="http://paulomorgado.net/pt/blog/archive/2010/04/15/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos-simplificado.aspx" target="_blank"&gt;Covariância E Contravariância Em Genéricos – Simplificado&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a title="Covarince and Contravariance in Generics" href="http://msdn.microsoft.com/library/dd799517(VS.100).aspx" target="_blank"&gt;Covarince and Contravariance in Generics&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a title="Exact rules for variance validity" href="http://blogs.msdn.com/ericlippert/archive/2009/12/03/exact-rules-for-vari&amp;acirc;ncia-validity.aspx" target="_blank"&gt;Exact rules for variance validity&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a title="Events get a little overhaul in C# 4, Afterward: Effective Events" href="http://blogs.msdn.com/cburrows/archive/2010/03/30/events-get-a-little-overhaul-in-c-4-afterward-effective-events.aspx" target="_blank"&gt;Events get a little overhaul in C# 4, Afterward: Effective Events&lt;/a&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Argumentos com Nome e Opcionais      &lt;ul&gt;       &lt;li&gt;&lt;a title="Argumentos Com Nome E Opcionais" href="http://paulomorgado.net/pt/blog/archive/2010/04/16/c-4-0-argumentos-com-nome-e-opcionais.aspx" target="_blank"&gt;Argumentos Com Nome E Opcionais&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a title="Alternativa Aos Argumentos Opcionais" href="http://paulomorgado.net/pt/blog/archive/2010/04/18/c-4-0-alternativa-aos-argumentos-opcionais.aspx" target="_blank"&gt;Alternativa Aos Argumentos Opcionais&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a title="Named and Optional Arguments (C# Programming Guide)" href="http://msdn.microsoft.com/library/dd264739(VS.100).aspx" target="_blank"&gt;Named and Optional Arguments (C# Programming Guide)&lt;/a&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Programação Dinâmica      &lt;ul&gt;       &lt;li&gt;&lt;a title="Programação Dinâmica" href="http://paulomorgado.net/pt/blog/archive/2010/04/18/c-4-0-programa-231-227-o-din-226-mica.aspx" target="_blank"&gt;Programação Dinâmica&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a title="Proposta C#: Verificação Estática De Objectos Dinâmicos Em Tempo De Compilação" href="http://paulomorgado.net/pt/blog/archive/2010/03/17/proposta-c-verifica-231-227-o-est-225-tica-de-objectos-din-226-micos-em-tempo-de-compila-231-227-o.aspx" target="_blank"&gt;Proposta C#: Verificação Estática De Objectos Dinâmicos Em Tempo De Compilação&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a title="Using Type dynamic (C# Programming Guide)" href="http://msdn.microsoft.com/library/dd264736(VS.100).aspx" target="_blank"&gt;Using Type dynamic (C# Programming Guide)&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a title="Dynamic Language Runtime Overview" href="http://msdn.microsoft.com/library/dd233052(v=VS.100).aspx" target="_blank"&gt;Dynamic Language Runtime Overview&lt;/a&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Melhoramentos na Interoperabilidade com COM      &lt;ul&gt;       &lt;li&gt;&lt;a title="Melhoramentos Para Interoperabilidade Com COM" href="http://paulomorgado.net/pt/blog/archive/2010/04/19/c-4-0-melhoramentos-para-interoperabilidade-com-com.aspx" target="_blank"&gt;Melhoramentos Para Interoperabilidade Com COM&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a title="Type Equivalence and Embedded Interop Types" href="http://msdn.microsoft.com/library/dd997297.aspx" target="_blank"&gt;Type Equivalence and Embedded Interop Types&lt;/a&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;Conclusão      &lt;ul&gt;       &lt;li&gt;&lt;a title="http://csharp.net/" href="http://csharp.net/" target="_blank"&gt;Visual C# Developer Center&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a title="Visual C# 2010 Samples" href="http://code.msdn.microsoft.com/cs2010samples" target="_blank"&gt;Visual C# 2010 Samples&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a title="C# Language Specification 4.0" href="http://www.microsoft.com/downloads/details.aspx?familyid=DFBF523C-F98C-4804-AFBD-459E846B268E" target="_blank"&gt;C# Language Specification 4.0&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a title=".NET Reflector" href="http://www.red-gate.com/products/reflector/" target="_blank"&gt;.NET Reflector&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a title="LINQPad" href="http://linqpad.net/" target="_blank"&gt;LINQPad&lt;/a&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt; &lt;/ul&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/23/techdays-2010-as-novidades-do-c-4-0.aspx&amp;amp;;subject=TechDays+2010%3a+As+Novidades+Do+C%23+4.0" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/23/techdays-2010-as-novidades-do-c-4-0.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/23/techdays-2010-as-novidades-do-c-4-0.aspx&amp;amp;;title=TechDays+2010%3a+As+Novidades+Do+C%23+4.0" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/23/techdays-2010-as-novidades-do-c-4-0.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/23/techdays-2010-as-novidades-do-c-4-0.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/23/techdays-2010-as-novidades-do-c-4-0.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/23/techdays-2010-as-novidades-do-c-4-0.aspx&amp;amp;title=TechDays+2010%3a+As+Novidades+Do+C%23+4.0" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/23/techdays-2010-as-novidades-do-c-4-0.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/23/techdays-2010-as-novidades-do-c-4-0.aspx&amp;amp;;title=TechDays+2010%3a+As+Novidades+Do+C%23+4.0" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/23/techdays-2010-as-novidades-do-c-4-0.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/23/techdays-2010-as-novidades-do-c-4-0.aspx&amp;amp;;title=TechDays+2010%3a+As+Novidades+Do+C%23+4.0&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/23/techdays-2010-as-novidades-do-c-4-0.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=58408" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET+/default.aspx">.NET </category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Eventos/default.aspx">Eventos</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TechDays/default.aspx">TechDays</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TechDaysPT10/default.aspx">TechDaysPT10</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/C_2300_4.0/default.aspx">C#4.0</category></item><item><title>Design-time versus Runtime Code Generation</title><link>http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/design-time-versus-runtime-code-generation.aspx</link><pubDate>Mon, 19 Apr 2010 15:16:36 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:58301</guid><dc:creator>hgr</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;This technical article by Rockford Lhotka hits again on the eternal debate about the advantages of code generation and the differences between generating at design-time or runtime…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ff621668.aspx" target="_blank"&gt;Design Time Code Generation and Runtime Model-Driven Generation&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The ancient history of my experience was completely around runtime generation. In fact, our products are full of instances of that.&lt;/p&gt;  &lt;p&gt;Over the last years, you’ve moved to the design-time side of the field. And there are a number of reasons for that.&lt;/p&gt;  &lt;p&gt;This article got me thinking again. Lhotka goes out to say that the advantages of code generation are guaranteed by both approaches but “(design-time automation) doesn’t offer the flexibility and adaptability provided by runtime automation”.&lt;/p&gt;  &lt;p&gt;The first thought that comes to my mind is that the affirmation is obviously true; but it comes at the expense of (at least) two very important “features”.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Complexity – just consider the complexity of a runtime that is capable of interpreting a set of models that describe a very large application (an ERP for example).&lt;/li&gt;    &lt;li&gt;Performance – as dynamic behavior will always (!) be slower than static.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The first one alone is enough to make me prefer design-time! Since I’m really sick of spending so much energy solving bugs and “design issues”… :)&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/design-time-versus-runtime-code-generation.aspx&amp;amp;;subject=Design-time+versus+Runtime+Code+Generation" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/design-time-versus-runtime-code-generation.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/design-time-versus-runtime-code-generation.aspx&amp;amp;;title=Design-time+versus+Runtime+Code+Generation" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/design-time-versus-runtime-code-generation.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/design-time-versus-runtime-code-generation.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/design-time-versus-runtime-code-generation.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/design-time-versus-runtime-code-generation.aspx&amp;amp;title=Design-time+versus+Runtime+Code+Generation" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/design-time-versus-runtime-code-generation.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/design-time-versus-runtime-code-generation.aspx&amp;amp;;title=Design-time+versus+Runtime+Code+Generation" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/design-time-versus-runtime-code-generation.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/design-time-versus-runtime-code-generation.aspx&amp;amp;;title=Design-time+versus+Runtime+Code+Generation&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/design-time-versus-runtime-code-generation.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=58301" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/tags/Software+Engineering/default.aspx">Software Engineering</category><category domain="http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/tags/Model-driven+Development/default.aspx">Model-driven Development</category></item><item><title>Microsoft Tech.Days’2010</title><link>http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/microsoft-tech-days-2010.aspx</link><pubDate>Mon, 19 Apr 2010 15:16:05 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:58300</guid><dc:creator>hgr</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;As I prepare for Tech.Days, I have to recommend this session in particular.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.techdays2010.com/Event/Session/Details/the-age-of-software-industrialization-combining-domain-driven-design-with-code" target="_blank"&gt;The Age of Software Industrialization (Pedro Salgueiro)&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I haven’t really studied the agenda in detail but this one will be interesting for sure.&lt;/p&gt;  &lt;p&gt;For more than one reason. :)&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/microsoft-tech-days-2010.aspx&amp;amp;;subject=Microsoft+Tech.Days%e2%80%992010" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/microsoft-tech-days-2010.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/microsoft-tech-days-2010.aspx&amp;amp;;title=Microsoft+Tech.Days%e2%80%992010" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/microsoft-tech-days-2010.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/microsoft-tech-days-2010.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/microsoft-tech-days-2010.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/microsoft-tech-days-2010.aspx&amp;amp;title=Microsoft+Tech.Days%e2%80%992010" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/microsoft-tech-days-2010.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/microsoft-tech-days-2010.aspx&amp;amp;;title=Microsoft+Tech.Days%e2%80%992010" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/microsoft-tech-days-2010.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/microsoft-tech-days-2010.aspx&amp;amp;;title=Microsoft+Tech.Days%e2%80%992010&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/2010/04/19/microsoft-tech-days-2010.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=58300" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://www.arquitecturadesoftware.org/blogs/hugoribeiro/archive/tags/Tech.Days/default.aspx">Tech.Days</category></item><item><title>C# 4.0: Melhoramentos Para Interoperabilidade Com COM</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/19/c-4-0-melhoramentos-para-interoperabilidade-com-com.aspx</link><pubDate>Mon, 19 Apr 2010 00:59:10 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:58284</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><description>&lt;p align="justify"&gt;A resolução dinâmica e argumentos com nome e opcionais melhoram largamente a experiência de interoperar com APIs &lt;a title="Component Object Model (COM)" href="http://msdn.microsoft.com/library/ms680573.aspx" target="_blank"&gt;&lt;strong&gt;COM&lt;/strong&gt;&lt;/a&gt; como as Office Automation &lt;a title="Primary Interop Assemblies (PIAs)" href="http://msdn.microsoft.com/library/aa302338.aspx" target="_blank"&gt;Primary Interop Assemblies (PIAs)&lt;/a&gt;. Mas, para aliviar ainda mais o desenvolvimento de interoperabilidade com &lt;strong&gt;COM&lt;/strong&gt;, foram adicionados algumas funcionalidades específicas para &lt;strong&gt;COM&lt;/strong&gt; ao &lt;a title="Microsoft Visual C#" href="http://csharp.net/" target="_blank"&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; 4.0&lt;/strong&gt;.&lt;/p&gt;  &lt;h4&gt;Omissão do Modificador ref&lt;/h4&gt;  &lt;p align="justify"&gt;Devido ao diferente modelo de programação, muitas APIs &lt;strong&gt;COM&lt;/strong&gt; contêm muitos parâmetros por referência. A intenção deste parâmetros não é modificar os argumentos que lhes são passados, mas apenas outro modo de passar valores.&lt;/p&gt;  &lt;p align="justify"&gt;Especificamente com métodos &lt;strong&gt;COM&lt;/strong&gt;, o compilador permite declarar a chamada ao método passando os argumentos por valor e gerará automaticamente variávias temporárias para manter os valores por forma a poder passá-los por referência e descartará os seus valores após o retorno da chamad ao método. Do ponto de vista do porgramador, os argumentos são passados por valor.&lt;/p&gt;  &lt;p align="justify"&gt;Sendo assim, esta chamada:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;object &lt;/span&gt;fileName = &lt;span style="color:#a31515;"&gt;&amp;quot;Test.docx&amp;quot;&lt;/span&gt;;
&lt;span style="color:blue;"&gt;object &lt;/span&gt;missing = &lt;span style="color:#2b91af;"&gt;Missing&lt;/span&gt;.Value;

document.SaveAs(&lt;span style="color:blue;"&gt;ref &lt;/span&gt;fileName,
    &lt;span style="color:blue;"&gt;ref &lt;/span&gt;missing, &lt;span style="color:blue;"&gt;ref &lt;/span&gt;missing, &lt;span style="color:blue;"&gt;ref &lt;/span&gt;missing,
    &lt;span style="color:blue;"&gt;ref &lt;/span&gt;missing, &lt;span style="color:blue;"&gt;ref &lt;/span&gt;missing, &lt;span style="color:blue;"&gt;ref &lt;/span&gt;missing,
    &lt;span style="color:blue;"&gt;ref &lt;/span&gt;missing, &lt;span style="color:blue;"&gt;ref &lt;/span&gt;missing, &lt;span style="color:blue;"&gt;ref &lt;/span&gt;missing,
    &lt;span style="color:blue;"&gt;ref &lt;/span&gt;missing, &lt;span style="color:blue;"&gt;ref &lt;/span&gt;missing, &lt;span style="color:blue;"&gt;ref &lt;/span&gt;missing,
    &lt;span style="color:blue;"&gt;ref &lt;/span&gt;missing, &lt;span style="color:blue;"&gt;ref &lt;/span&gt;missing, &lt;span style="color:blue;"&gt;ref &lt;/span&gt;missing);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;pode ser escrita assim:&lt;/p&gt;

&lt;pre class="code"&gt;document.SaveAs(&lt;span style="color:#a31515;"&gt;&amp;quot;Test.docx&amp;quot;&lt;/span&gt;,
    &lt;span style="color:#2b91af;"&gt;Missing&lt;/span&gt;.Value, &lt;span style="color:#2b91af;"&gt;Missing&lt;/span&gt;.Value, &lt;span style="color:#2b91af;"&gt;Missing&lt;/span&gt;.Value,
    &lt;span style="color:#2b91af;"&gt;Missing&lt;/span&gt;.Value, &lt;span style="color:#2b91af;"&gt;Missing&lt;/span&gt;.Value, &lt;span style="color:#2b91af;"&gt;Missing&lt;/span&gt;.Value,
    &lt;span style="color:#2b91af;"&gt;Missing&lt;/span&gt;.Value, &lt;span style="color:#2b91af;"&gt;Missing&lt;/span&gt;.Value, &lt;span style="color:#2b91af;"&gt;Missing&lt;/span&gt;.Value,
    &lt;span style="color:#2b91af;"&gt;Missing&lt;/span&gt;.Value, &lt;span style="color:#2b91af;"&gt;Missing&lt;/span&gt;.Value, &lt;span style="color:#2b91af;"&gt;Missing&lt;/span&gt;.Value,
    &lt;span style="color:#2b91af;"&gt;Missing&lt;/span&gt;.Value, &lt;span style="color:#2b91af;"&gt;Missing&lt;/span&gt;.Value, &lt;span style="color:#2b91af;"&gt;Missing&lt;/span&gt;.Value);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;E porque todos os parâmteros que recebem o valor &lt;strong&gt;Missing.Value&lt;/strong&gt; têm esse valor como valor por omissão, a declaração da chamada ao método pode ser reduzida a:&lt;/p&gt;

&lt;pre class="code"&gt;document.SaveAs(&lt;span style="color:#a31515;"&gt;&amp;quot;Test.docx&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;h4&gt;Importação Dinâmica&lt;/h4&gt;

&lt;p align="justify"&gt;Muitos métodos &lt;strong&gt;COM&lt;/strong&gt; aceitam e retornam tipos &lt;strong&gt;variant&lt;/strong&gt;, que são representados nas &lt;strong&gt;PIA&lt;/strong&gt;s como &lt;strong&gt;object&lt;/strong&gt;. Na grande maioria dos casos, o programador que está a chamar estes métodos conheço o tipo estático dos objectos que estão a ser retornados pelo contexto da chamada, mas ainda são obrigados a explicitamente converter o valor retornado para fazer uso desse seu conhecimento. Estas conversões são tão comuns que se tornam um incómodo.&lt;/p&gt;

&lt;p align="justify"&gt;Para tornar a vida do programador mais fácil, é agora possível importar as APIs &lt;strong&gt;COM&lt;/strong&gt; de modo a que os &lt;strong&gt;variants&lt;/strong&gt; seja representados usando o tipo &lt;strong&gt;&lt;a title="dynamic (C# Reference)" href="http://msdn.microsoft.com/library/dd264741.aspx" target="_blank"&gt;dynamic&lt;/a&gt;&lt;/strong&gt; o que quer dizer que as assinaturas &lt;strong&gt;COM&lt;/strong&gt; têm agora ocorrências de &lt;strong&gt;dynamic&lt;/strong&gt; em vez de &lt;strong&gt;object&lt;/strong&gt;.&lt;/p&gt;

&lt;p align="justify"&gt;Isto quer dizer que membros de um objecto retornado podem agora ser facilemtne acedidos ou atribuídos a variáveis fortemente tipadas sem necessiade de conversão explícita.&lt;/p&gt;

&lt;p align="justify"&gt;Em vez deste código:&lt;/p&gt;

&lt;pre class="code"&gt;((Excel.&lt;span style="color:#2b91af;"&gt;Range&lt;/span&gt;)(excel.Cells[1, 1])).Value2 = &lt;span style="color:#a31515;"&gt;&amp;quot;Hello World!&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;pode ser usado este:&lt;/p&gt;

&lt;pre class="code"&gt;excel.Cells[1, 1] = &lt;span style="color:#a31515;"&gt;&amp;quot;Hello World!&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;E em vez deste:&lt;/p&gt;

&lt;pre class="code"&gt;Excel.&lt;span style="color:#2b91af;"&gt;Range &lt;/span&gt;range = (Excel.&lt;span style="color:#2b91af;"&gt;Range&lt;/span&gt;)(excel.Cells[1, 1]);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;pode ser usado este:&lt;/p&gt;

&lt;pre class="code"&gt;Excel.&lt;span style="color:#2b91af;"&gt;Range &lt;/span&gt;range = excel.Cells[1, 1];&lt;/pre&gt;

&lt;h4&gt;Propriedades Indexadas E Por Omissão&lt;/h4&gt;

&lt;p align="justify"&gt;Algumas funcionalidades das interfaces &lt;strong&gt;COM&lt;/strong&gt; ainda não estão disponíveis em &lt;strong&gt;C#&lt;/strong&gt;. No topo desta lista estão as propriedades indexadas e as propriedades por omissão. Como mencionado anteriormente, estas poderão ser usadas se a interface &lt;strong&gt;COM&lt;/strong&gt; for acedida dinâmicamente, mas não serão reconhecidas por código &lt;strong&gt;C#&lt;/strong&gt; estáticamente tipoado.&lt;/p&gt;

&lt;h4&gt;No PIAs – Equivalênica De Tipos E Tipos Embebidos&lt;/h4&gt;

&lt;p align="justify"&gt;Para &lt;em&gt;assemblies&lt;/em&gt; indentificadas com &lt;a title="PrimaryInteropAssemblyAttribute Class" href="http://msdn.microsoft.com/library/System.Runtime.InteropServices.PrimaryInteropAssemblyAttribute.aspx" target="_blank"&gt;PrimaryInteropAssemblyAttribute&lt;/a&gt;, o compilador criará tipos equivalentes (interfaces, estruturas, enumerados e &lt;em&gt;delegates&lt;/em&gt;) e embebê-los-á na &lt;em&gt;assembly&lt;/em&gt; gerada.&lt;/p&gt;

&lt;p align="justify"&gt;Para reduzir a dimensão final da &lt;em&gt;assembly&lt;/em&gt; gerada, apenas os tipos e seus membros usados serão gerados e embebidos.&lt;/p&gt;

&lt;p align="justify"&gt;Embora isto torne o desenvolvimento e distribuição de aplicações que usam os componentes &lt;strong&gt;COM&lt;/strong&gt; mais fácil porque não há necessidade de distribuír as &lt;strong&gt;PIA&lt;/strong&gt;s, quem desenvolve os componentes &lt;strong&gt;COM&lt;/strong&gt; continua a ter de desenvolver as &lt;strong&gt;PIA&lt;/strong&gt;s.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/19/c-4-0-melhoramentos-para-interoperabilidade-com-com.aspx&amp;amp;;subject=C%23+4.0%3a+Melhoramentos+Para+Interoperabilidade+Com+COM" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/19/c-4-0-melhoramentos-para-interoperabilidade-com-com.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/19/c-4-0-melhoramentos-para-interoperabilidade-com-com.aspx&amp;amp;;title=C%23+4.0%3a+Melhoramentos+Para+Interoperabilidade+Com+COM" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/19/c-4-0-melhoramentos-para-interoperabilidade-com-com.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/19/c-4-0-melhoramentos-para-interoperabilidade-com-com.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/19/c-4-0-melhoramentos-para-interoperabilidade-com-com.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/19/c-4-0-melhoramentos-para-interoperabilidade-com-com.aspx&amp;amp;title=C%23+4.0%3a+Melhoramentos+Para+Interoperabilidade+Com+COM" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/19/c-4-0-melhoramentos-para-interoperabilidade-com-com.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/19/c-4-0-melhoramentos-para-interoperabilidade-com-com.aspx&amp;amp;;title=C%23+4.0%3a+Melhoramentos+Para+Interoperabilidade+Com+COM" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/19/c-4-0-melhoramentos-para-interoperabilidade-com-com.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/19/c-4-0-melhoramentos-para-interoperabilidade-com-com.aspx&amp;amp;;title=C%23+4.0%3a+Melhoramentos+Para+Interoperabilidade+Com+COM&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/19/c-4-0-melhoramentos-para-interoperabilidade-com-com.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=58284" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET+/default.aspx">.NET </category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Eventos/default.aspx">Eventos</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Desenvolvimento/default.aspx">Desenvolvimento</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TechDays/default.aspx">TechDays</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TechDaysPT10/default.aspx">TechDaysPT10</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/C_2300_4.0/default.aspx">C#4.0</category></item><item><title>C# 4.0: Programa&amp;#231;&amp;#227;o Din&amp;#226;mica</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-programa-231-227-o-din-226-mica.aspx</link><pubDate>Sun, 18 Apr 2010 18:45:37 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:58277</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><description>&lt;p align="justify"&gt;A principal funcionalidade do &lt;a title="Microsoft Visual C#" href="http://csharp.net/" target="_blank"&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; 4.0&lt;/strong&gt; é a programação dinâmica. Não apenas em termos de tipos dinâmicos, mas, un sentido mais lato, a capacidade de falar com qualquer coisa que não seja staicamente tipada para ser um objecto &lt;a title="Microsoft .NET Framework" href="http://www.microsoft.com/net/" target="_blank"&gt;&lt;strong&gt;.NET&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;  &lt;h4&gt;Dynamic Language Runtime&lt;/h4&gt;  &lt;p align="justify"&gt;O &lt;strong&gt;Ambiente de Execução para Linguagens Dinâmicas&lt;/strong&gt; (&lt;a title="Dynamic Language Runtime Overview" href="http://msdn.microsoft.com/library/dd233052.aspx" target="_blank"&gt;Dynamic Language Runtime&lt;/a&gt; - &lt;strong&gt;DLR&lt;/strong&gt;) é um pedaço de tecnologia que unifica a programação dinâmica na plataforma &lt;a title="Microsoft .NET Framework" href="http://www.microsoft.com/net/" target="_blank"&gt;&lt;/a&gt;&lt;strong&gt;.NET&lt;/strong&gt;, da mesma forma que o &lt;strong&gt;Ambiente de Execução Comum para Linguagens&lt;/strong&gt; (&lt;a title="Common Language Runtime Overview" href="http://msdn.microsoft.com/library/ddk909ch.aspx" target="_blank"&gt;Common Language Runtime&lt;/a&gt; - &lt;strong&gt;CLR&lt;/strong&gt;) tem sido a plataforma comum para linguagens estaticamente tipadas.&lt;/p&gt;  &lt;p align="justify"&gt;A &lt;strong&gt;CLR&lt;/strong&gt; sempre teve capacidedes dinâmicas. Sempre foi possível usar &lt;a title="Reflection" href="http://msdn.microsoft.com/library/f7ykdhsy.aspx" target="_blank"&gt;reflecção&lt;/a&gt;, mas o seu prinicpal objectivo nunca foi ser um ambiente de programação dinamido e faltava-lhe algumas funcionalidades. A &lt;strong&gt;DLR&lt;/strong&gt; assenta na &lt;strong&gt;CLR&lt;/strong&gt; e adiciona essas funcionalidades em falta à plataforma &lt;strong&gt;.NET&lt;/strong&gt;.&lt;/p&gt;  &lt;p align="center"&gt;&lt;img style="border-bottom:1px solid;border-left:1px solid;margin:0px auto;display:block;float:none;border-top:1px solid;border-right:1px solid;" title="Dynamic Language Runtime" border="0" alt="Dynamic Language Runtime" src="http://lh5.ggpht.com/_PEyUx0qf5g0/S8p4iZkpRCI/AAAAAAAAAGA/r7SZQrI63hs/Dynamic%20Language%20Runtime.jpg" width="640" height="316" /&gt;&lt;/p&gt;  &lt;p align="justify"&gt;A &lt;strong&gt;DLR&lt;/strong&gt; é a infra-estrutura base que consiste em:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p align="left"&gt;&lt;strong&gt;Dynamic Dispatch&lt;/strong&gt;&lt;/p&gt;      &lt;p align="justify"&gt;As mesmas &lt;a title="Expression Trees (C# and Visual Basic)" href="http://msdn.microsoft.com/library/bb397951.aspx" target="_blank"&gt;árvores de expressões&lt;/a&gt; usedadas no &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt;, agora melhoradas para suportar instruções.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p align="left"&gt;&lt;strong&gt;Dynamic Dispatch&lt;/strong&gt;&lt;/p&gt;      &lt;p align="justify"&gt;Despacha as invocações para o &lt;em&gt;binder&lt;/em&gt; apropriado.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;p align="left"&gt;&lt;strong&gt;Call Site Caching&lt;/strong&gt;&lt;/p&gt;      &lt;p align="justify"&gt;Para melhor eficiência.&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;As linguagens dinâmicas e as linguagens dinâmicas assentam na &lt;strong&gt;DLR&lt;/strong&gt;. O &lt;a title="IronPython" href="http://www.ironpython.net/" target="_blank"&gt;&lt;strong&gt;IronPython&lt;/strong&gt;&lt;/a&gt; e o &lt;a title="IronRuby" href="http://ironruby.net/" target="_blank"&gt;&lt;strong&gt;IronRuby&lt;/strong&gt;&lt;/a&gt; já assentavam na &lt;strong&gt;DLR&lt;/strong&gt;, e agora, o suporte para usar a &lt;strong&gt;DLR&lt;/strong&gt; foi adicionado ao &lt;strong&gt;C#&lt;/strong&gt; e ao &lt;a title="Visual Basic Developer Center" href="http://msdn.microsoft.com/vbasic/" target="_blank"&gt;&lt;strong&gt;Visual Basic&lt;/strong&gt;&lt;/a&gt;. Espera-se que outras linguagens construídas sobre a &lt;strong&gt;CLR&lt;/strong&gt; passem também, no futuro, a usar a &lt;strong&gt;DLR&lt;/strong&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Sob a &lt;strong&gt;DLR&lt;/strong&gt; encontram-se os &lt;em&gt;binders&lt;/em&gt; que falam com uma variedade de diferentes tecnologias:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="left"&gt;&lt;strong&gt;.NET Binder&lt;/strong&gt;&lt;/div&gt;      &lt;p align="justify"&gt;Permite falar com objectos &lt;strong&gt;.NET&lt;/strong&gt;.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;&lt;strong&gt;JavaScript Binder&lt;/strong&gt;&lt;/div&gt;      &lt;p align="justify"&gt;Permite falar com &lt;strong&gt;JavaScript&lt;/strong&gt; em &lt;a title="Silverlight" href="http://Silverlight.net" target="_blank"&gt;&lt;strong&gt;SilverLight&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;&lt;strong&gt;IronPython Binder&lt;/strong&gt;&lt;/div&gt;      &lt;p align="justify"&gt;Permite falar com &lt;a title="IronPython" href="http://www.ironpython.net/" target="_blank"&gt;&lt;strong&gt;IronPython&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;&lt;strong&gt;IronRuby Binder&lt;/strong&gt;&lt;/div&gt;      &lt;p align="justify"&gt;Permite falar com &lt;a title="IronRuby" href="http://ironruby.net/" target="_blank"&gt;&lt;strong&gt;IronRuby&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="left"&gt;&lt;strong&gt;COM Binder&lt;/strong&gt;&lt;a title="Component Object Model (COM)" href="http://msdn.microsoft.com/library/ms680573.aspx" target="_blank"&gt;&lt;/a&gt;&lt;/div&gt;      &lt;p align="justify"&gt;Permite falar com &lt;a title="Component Object Model (COM)" href="http://msdn.microsoft.com/library/ms680573.aspx" target="_blank"&gt;&lt;strong&gt;COM&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Com todos estes &lt;em&gt;binders&lt;/em&gt; é possível ter uma única experiência de programação para falar com todos estes ambientes que não são objectos &lt;strong&gt;.NET&lt;/strong&gt; estaticamente tipados.&lt;/p&gt;  &lt;h4&gt;O Tipo Estático dynamic&lt;/h4&gt;  &lt;p align="justify"&gt;Tomemos este tradicional código estaticamente tipado:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;Calculator &lt;/span&gt;calculator = GetCalculator();
&lt;span style="color:blue;"&gt;int &lt;/span&gt;sum = calculator.Sum(10, 20);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Porque a variável que recebe o valor de retorno do método &lt;strong&gt;GetCalulator&lt;/strong&gt; é estaticamente tipada para ser do tipo &lt;strong&gt;Calculator&lt;/strong&gt; e, porque o tipo &lt;strong&gt;Calculator&lt;/strong&gt; tem um método &lt;strong&gt;Add&lt;/strong&gt; que recebe dois inteiros e retorna um inteiro, é possível chamar esse método &lt;strong&gt;Sum&lt;/strong&gt; e atribuír o seu valor de retorno a uma variável etaticamente tipada como inteiro.&lt;/p&gt;

&lt;p align="justify"&gt;Agora suponhamos que a calculadora não era uma classe &lt;strong&gt;.NET&lt;/strong&gt; estaticamente tipada, mas, em vez disso, um objecto &lt;strong&gt;COM&lt;/strong&gt; ou algum códiogo &lt;strong&gt;.NET&lt;/strong&gt; de que não conhecemos o tipo. De repente tornou-se muito penoso chamar o método &lt;strong&gt;Add&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;object &lt;/span&gt;calculator = GetCalculator();
&lt;span style="color:#2b91af;"&gt;Type &lt;/span&gt;calculatorType = calculator.GetType();
&lt;span style="color:blue;"&gt;object &lt;/span&gt;res = calculatorType.InvokeMember(&lt;span style="color:#a31515;"&gt;&amp;quot;Add&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;BindingFlags&lt;/span&gt;.InvokeMethod, &lt;span style="color:blue;"&gt;null&lt;/span&gt;, calculator, &lt;span style="color:blue;"&gt;new object&lt;/span&gt;[] { 10, 20 });
&lt;span style="color:blue;"&gt;int &lt;/span&gt;sum = &lt;span style="color:#2b91af;"&gt;Convert&lt;/span&gt;.ToInt32(res);&lt;/pre&gt;

&lt;p align="justify"&gt;E se a calculador for um objecto &lt;strong&gt;JavaScript&lt;/strong&gt;?&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;ScriptObject &lt;/span&gt;calculator = GetCalculator();
&lt;span style="color:blue;"&gt;object &lt;/span&gt;res = calculator.Invoke(&lt;span style="color:#a31515;"&gt;&amp;quot;Add&amp;quot;&lt;/span&gt;, 10, 20);
&lt;span style="color:blue;"&gt;int &lt;/span&gt;sum = &lt;span style="color:#2b91af;"&gt;Convert&lt;/span&gt;.ToInt32(res);&lt;/pre&gt;

&lt;p&gt;Para cada domínio dinâmico temos uma experiência de programação diferente o que torna a unificação do código muito difícil.&lt;/p&gt;

&lt;p&gt;Com o &lt;strong&gt;C# 4.&lt;/strong&gt;&lt;strong&gt;0&lt;/strong&gt; é agora possível escrever código como este:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;dynamic &lt;/span&gt;calculator = GetCalculator();
&lt;span style="color:blue;"&gt;int &lt;/span&gt;sum = calculator.Add(10, 20);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Basta declarar uma variável cujo tipo estático é &lt;strong&gt;&lt;a title="dynamic (C# Reference)" href="http://msdn.microsoft.com/library/dd264741.aspx" target="_blank"&gt;dynamic&lt;/a&gt;&lt;/strong&gt;. &lt;strong&gt;dynamic&lt;/strong&gt; é uma pseudo palavra reservada (como &lt;a title="var (C# Reference)" href="http://msdn.microsoft.com/library/bb383973.aspx" target="_blank"&gt;&lt;strong&gt;var&lt;/strong&gt;&lt;/a&gt;) que indica ao compilador que a resolução das operações sobre &lt;strong&gt;calculator&lt;/strong&gt; será efectuada de forma dinâmica.&lt;/p&gt;

&lt;p align="justify"&gt;Deve-se encarar um &lt;strong&gt;dynamic&lt;/strong&gt; como um &lt;strong&gt;object&lt;/strong&gt; (&lt;a title="Object Class" href="http://msdn.microsoft.com/library/system.object.aspx" target="_blank"&gt;System.Object&lt;/a&gt;) com semântica dinâmica associada. Qualquer coisa pode ser afectada a &lt;strong&gt;dynamic&lt;/strong&gt;.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;dynamic &lt;/span&gt;x = 1;
&lt;span style="color:blue;"&gt;dynamic &lt;/span&gt;y = &lt;span style="color:#a31515;"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;;
&lt;span style="color:blue;"&gt;dynamic &lt;/span&gt;z = &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:blue;"&gt;int&lt;/span&gt;&amp;gt; { 1, 2, 3 };&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Em tempo de execução, todos os objectos terão um tipo. No exemplo acima, No exemplo precedente, em tempo de execução, &lt;strong&gt;x&lt;/strong&gt; é do tipo &lt;strong&gt;System.Int32&lt;/strong&gt;.&lt;/p&gt;

&lt;p align="justify"&gt;Quando um ou mais operandos de uma operação são tipados &lt;strong&gt;dynamic&lt;/strong&gt;, a selecção do método a chamar é deferida para tempo de execução ao invés de ser feita em tempo de compilação. Então o tipo em tempo de execução é substituído em todas as variáveis e a resolução de sobreposições (&lt;em&gt;overloads&lt;/em&gt;) ocorre, tal como em tempo de com ocorreria em tempo de compilação.&lt;/p&gt;

&lt;p align="justify"&gt;O resultado de qualquer operação dinâmtica é sempre &lt;strong&gt;dynamic&lt;/strong&gt; e, quando um objecto &lt;strong&gt;dynamic&lt;/strong&gt; é atribuído a algo, ocorre uma conversão dinâmica.&lt;/p&gt;

&lt;table cellspacing="0" cellpadding="2"&gt;
    &lt;tr&gt;
      &lt;th&gt;Código&lt;/th&gt;

      &lt;th&gt;Resolução&lt;/th&gt;

      &lt;th&gt;Método&lt;/th&gt;
    &lt;/tr&gt;

    &lt;tr&gt;&lt;/tr&gt;
  
    &lt;tr&gt;
      &lt;td&gt;
        &lt;pre class="code"&gt;&lt;font color="blue"&gt;double&lt;/font&gt; x = 1.75;
&lt;font color="#0000ff"&gt;double&lt;/font&gt; y = &lt;span style="color:#2b91af;"&gt;Math&lt;/span&gt;.Abs(x);&lt;/pre&gt;
      &lt;/td&gt;

      &lt;td&gt;
        &lt;p align="center"&gt;Tempo de compilação&lt;/p&gt;
      &lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;strong&gt;&lt;font color="#000000"&gt;double Abs(double x)&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;
        &lt;pre class="code"&gt;&lt;font color="#0000ff"&gt;dynamic&lt;/font&gt; x = 1.75;
&lt;font color="#0000ff"&gt;dynamic&lt;/font&gt; y = &lt;span style="color:#2b91af;"&gt;Math&lt;/span&gt;.Abs(x);&lt;/pre&gt;
      &lt;/td&gt;

      &lt;td&gt;
        &lt;p align="center"&gt;Tempo de execução&lt;/p&gt;
      &lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;strong&gt;double Abs(double x)&lt;/strong&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
      &lt;td&gt;
        &lt;pre class="code"&gt;&lt;font color="#0000ff"&gt;dynamic&lt;/font&gt; x = 2;
&lt;font color="#0000ff"&gt;dynamic&lt;/font&gt; y = &lt;span style="color:#2b91af;"&gt;Math&lt;/span&gt;.Abs(x);     &lt;/pre&gt;
      &lt;/td&gt;

      &lt;td&gt;
        &lt;p align="center"&gt;Tempo de execução&lt;/p&gt;
      &lt;/td&gt;

      &lt;td&gt;
        &lt;p&gt;&lt;strong&gt;int Abs(int x)&lt;/strong&gt;&lt;/p&gt;
      &lt;/td&gt;
    &lt;/tr&gt;
  &lt;/table&gt;

&lt;p align="justify"&gt;O código acima será sempre fortemente tipado. A diferença é que, no primeiro caso a resolução do método é feita m tempo de compilação, e nos outros em tempo de execução.&lt;/p&gt;

&lt;h4&gt;IDynamicMetaObjectObject&lt;/h4&gt;

&lt;p align="justify"&gt;A está &lt;strong&gt;DLR&lt;/strong&gt; pré-preparada para conhecer objectos &lt;strong&gt;.NET&lt;/strong&gt;, ojectos &lt;strong&gt;COM&lt;/strong&gt; mas qualquer linguagem dinâmica pode implementar os seus próprios objectos dinãmicos, assim como qualquer programador pode implementar os seus objectos dinâmicos em &lt;strong&gt;C#&lt;/strong&gt; através da implementação da interface &lt;a title="IDynamicMetaObjectProvider" href="http://msdn.microsoft.com/library/system.dynamic.idynamicmetaobjectprovider.aspx" target="_blank"&gt;&lt;strong&gt;IDynamicMetaObjectProvider&lt;/strong&gt;&lt;/a&gt;. Quando um objecto implementa &lt;strong&gt;IDynamicMetaObjectProvider&lt;/strong&gt;, pode participar na resolição de como os métodos são chamados ou as propriedaes acedidas.&lt;/p&gt;

&lt;p align="justify"&gt;A &lt;a title="Microsoft .NET Framework" href="http://www.microsoft.com/netframework/" target="_blank"&gt;&lt;strong&gt;.NET Framework&lt;/strong&gt;&lt;/a&gt; já contem duas implementações de &lt;strong&gt;IDynamicMetaObjectProvider&lt;/strong&gt;:&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="left"&gt;&lt;strong&gt;DynamicObject : &lt;strong&gt;IDynamicMetaObjectProvider&lt;/strong&gt;&lt;/strong&gt;&lt;/div&gt;

    &lt;p align="justify"&gt;A classe &lt;strong&gt;&lt;a title="DynamicObject Class" href="http://msdn.microsoft.com/library/system.dynamic.dynamicobject.aspx" target="_blank"&gt;DynamicObject&lt;/a&gt;&lt;/strong&gt; permite definir que operações podem ser executadas em objectos dinâmicos e como serão executadas essas operações. Por exemplo, pode-se definir o que acontece quando se tenta ler ou escreve uma propriedade, chamar um método ou efectuar operações matemática como adições e multiplicações.&lt;/p&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="left"&gt;&lt;strong&gt;ExpandoObject : &lt;strong&gt;IDynamicMetaObjectProvider&lt;/strong&gt;&lt;/strong&gt;&lt;/div&gt;

    &lt;p align="justify"&gt;A classe &lt;strong&gt;&lt;a title="ExpandoObject Class" href="http://msdn.microsoft.com/library/system.dynamic.expandoobject.aspx" target="_blank"&gt;ExpandoObject&lt;/a&gt;&lt;/strong&gt; permite adicionar e remover membros às suas instâncias em tempo de execução e também obter os valores desses membros. Esta classe suporta a ligação dinâmica que permite usar um sintaxe normal como &lt;strong&gt;sampleObject.sampleMember&lt;/strong&gt;, em vez de uma sintaxe mais complexa como&amp;#160; &lt;strong&gt;sampleObject.GetAttribute(&amp;quot;sampleMember&amp;quot;)&lt;/strong&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-programa-231-227-o-din-226-mica.aspx&amp;amp;;subject=C%23+4.0%3a+Programa%26amp%3b%23231%3b%26amp%3b%23227%3bo+Din%26amp%3b%23226%3bmica" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-programa-231-227-o-din-226-mica.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-programa-231-227-o-din-226-mica.aspx&amp;amp;;title=C%23+4.0%3a+Programa%26amp%3b%23231%3b%26amp%3b%23227%3bo+Din%26amp%3b%23226%3bmica" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-programa-231-227-o-din-226-mica.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-programa-231-227-o-din-226-mica.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-programa-231-227-o-din-226-mica.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-programa-231-227-o-din-226-mica.aspx&amp;amp;title=C%23+4.0%3a+Programa%26amp%3b%23231%3b%26amp%3b%23227%3bo+Din%26amp%3b%23226%3bmica" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-programa-231-227-o-din-226-mica.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-programa-231-227-o-din-226-mica.aspx&amp;amp;;title=C%23+4.0%3a+Programa%26amp%3b%23231%3b%26amp%3b%23227%3bo+Din%26amp%3b%23226%3bmica" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-programa-231-227-o-din-226-mica.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-programa-231-227-o-din-226-mica.aspx&amp;amp;;title=C%23+4.0%3a+Programa%26amp%3b%23231%3b%26amp%3b%23227%3bo+Din%26amp%3b%23226%3bmica&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-programa-231-227-o-din-226-mica.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=58277" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET+/default.aspx">.NET </category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Eventos/default.aspx">Eventos</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Desenvolvimento/default.aspx">Desenvolvimento</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TechDays/default.aspx">TechDays</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/MSBuild/default.aspx">MSBuild</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TechDaysPT10/default.aspx">TechDaysPT10</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/C_2300_4.0/default.aspx">C#4.0</category></item><item><title>C# 4.0: Alternativa Aos Argumentos Opcionais</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-alternativa-aos-argumentos-opcionais.aspx</link><pubDate>Sun, 18 Apr 2010 01:11:43 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:58255</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><description>&lt;p align="justify"&gt;Tal como mencionei na minha última &lt;a title="C# 4.0: Argumentos Com Nome E Opcionais" href="http://pontonetpt.com/blogs/paulomorgado/archive/2010/04/16/c-4-0-argumentos-com-nome-e-opcionais.aspx" target="_blank"&gt;entrada&lt;/a&gt;, expor publicamente métodos com argumentos opcionais é uma má prática (é por isso que o &lt;a title="Microsoft Visual C#" href="http://csharp.net/" target="_blank"&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;/a&gt; resitiu a tê-los, até agora).&lt;/p&gt;  &lt;p align="justify"&gt;Podem argumentar que o vosso método ou construtor tem demasiadas variações e ter mais de dez variantes é um pesadelo de manutenção, e têm razão. Mas a solução já existe há muito tempo: classes de argumentos.&lt;/p&gt;  &lt;p align="justify"&gt;O padrão da classe de argumentos é usado na &lt;a title="Microsoft .NET Framework" href="http://www.microsoft.com/netframework/" target="_blank"&gt;.NET Framework&lt;/a&gt; por várias classes, com &lt;a title="XmlReader Class" href="http://msdn.microsoft.com/library/system.xml.xmlreader.aspx" target="_blank"&gt;XmlReader&lt;/a&gt; e &lt;a title="XmlWriter Class" href="http://msdn.microsoft.com/library/system.xml.xmlwriter(.aspx" target="_blank"&gt;XmlWriter&lt;/a&gt; que usa este padrão nos seus métodos &lt;strong&gt;Create&lt;/strong&gt;, desde a versão 2.0:&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.ValidationType = &lt;span style="color:#2b91af;"&gt;ValidationType&lt;/span&gt;.Auto;
&lt;span style="color:#2b91af;"&gt;XmlReader&lt;/span&gt;.Create(&lt;span style="color:#a31515;"&gt;&amp;quot;file.xml&amp;quot;&lt;/span&gt;, settings);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Com este padrão, não é necessário manter uma longa lista de sobreposições e quaisquer valores por omissão para propriedades de &lt;a title="XmlReaderSettings Class" href="http://msdn.microsoft.com/library/system.xml.xmlreadersettings.aspx" target="_blank"&gt;XmlReaderSettings&lt;/a&gt; (ou &lt;a title="XmlWriterSettings Class" href="http://msdn.microsoft.com/library/system.xml.xmlwritersettings.aspx" target="_blank"&gt;XmlWriterSettings&lt;/a&gt; para &lt;strong&gt;XmlWriter.Create&lt;/strong&gt;) pode ser modificados ou até mesmo novas propriedades podem ser acrescentadas em futuras implementações sem que se quebre código já compilado existente.&lt;/p&gt;

&lt;p align="justify"&gt;Podem agora argumentar que é demasiado código para escrever, mas, com os inicializadores de objectos introduzidos no &lt;strong&gt;C# 3.0&lt;/strong&gt;, o mesmo código pode ser escrito assim:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;XmlReader&lt;/span&gt;.Create(&lt;span style="color:#a31515;"&gt;&amp;quot;file.xml&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;XmlReaderSettings &lt;/span&gt;{ ValidationType = &lt;span style="color:#2b91af;"&gt;ValidationType&lt;/span&gt;.Auto });&lt;/pre&gt;

&lt;p align="justify"&gt;Parece-se com argumentos com nome e opcionais, não parece? E, quem sabe, numa futura versão do &lt;strong&gt;C#&lt;/strong&gt;, pode até parecer-se com isto:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;XmlReader&lt;/span&gt;.Create(&lt;span style="color:#a31515;"&gt;&amp;quot;file.xml&amp;quot;&lt;/span&gt;, &lt;span style="color:blue;"&gt;new &lt;/span&gt;{ ValidationType = &lt;span style="color:#2b91af;"&gt;ValidationType&lt;/span&gt;.Auto });&lt;/pre&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-alternativa-aos-argumentos-opcionais.aspx&amp;amp;;subject=C%23+4.0%3a+Alternativa+Aos+Argumentos+Opcionais" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-alternativa-aos-argumentos-opcionais.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-alternativa-aos-argumentos-opcionais.aspx&amp;amp;;title=C%23+4.0%3a+Alternativa+Aos+Argumentos+Opcionais" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-alternativa-aos-argumentos-opcionais.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-alternativa-aos-argumentos-opcionais.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-alternativa-aos-argumentos-opcionais.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-alternativa-aos-argumentos-opcionais.aspx&amp;amp;title=C%23+4.0%3a+Alternativa+Aos+Argumentos+Opcionais" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-alternativa-aos-argumentos-opcionais.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-alternativa-aos-argumentos-opcionais.aspx&amp;amp;;title=C%23+4.0%3a+Alternativa+Aos+Argumentos+Opcionais" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-alternativa-aos-argumentos-opcionais.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-alternativa-aos-argumentos-opcionais.aspx&amp;amp;;title=C%23+4.0%3a+Alternativa+Aos+Argumentos+Opcionais&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/18/c-4-0-alternativa-aos-argumentos-opcionais.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=58255" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET+/default.aspx">.NET </category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Eventos/default.aspx">Eventos</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Desenvolvimento/default.aspx">Desenvolvimento</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TechDays/default.aspx">TechDays</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TechDaysPT10/default.aspx">TechDaysPT10</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/C_2300_4.0/default.aspx">C#4.0</category></item><item><title>C# 4.0: Argumentos Com Nome E Opcionais</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/16/c-4-0-argumentos-com-nome-e-opcionais.aspx</link><pubDate>Fri, 16 Apr 2010 01:06:03 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:58200</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>1</slash:comments><description>&lt;p align="justify"&gt;Como parte do &lt;a title="A Evolução Do C#" href="http://paulomorgado.net/pt/blog/archive/2010/04/12/a-evolu-231-227-o-do-c.aspx" target="_blank"&gt;esforço de co-evolução&lt;/a&gt; do &lt;a title="Microsoft Visual C#" href="http://csharp.net/" target="_blank"&gt;C#&lt;/a&gt; e do &lt;a title="Visual Basic Developer Center" href="http://msdn.microsoft.com/vbasic/" target="_blank"&gt;Visual Basic&lt;/a&gt;, o &lt;strong&gt;C# 4.0&lt;/strong&gt; introduz &lt;strong&gt;Argumentos com Nome e Opcionais&lt;/strong&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Primeiro clarifiquemos o que são &lt;strong&gt;argumentos&lt;/strong&gt; e o que são &lt;strong&gt;parâmetros&lt;/strong&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Os &lt;strong&gt;parâmetros&lt;/strong&gt; da definição de um método são as variáveis de entrada do método.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Os &lt;strong&gt;argumentos&lt;/strong&gt; da declaração da chamada a um método são os valores providenciados para os .&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;De facto, a &lt;strong&gt;Especificação da Linguagem C#&lt;/strong&gt; afirma em §7.5 que:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;A lista de argumentos (§7.5.1) da invocação de um membro função providencia os valores que vão ser efectivamente usados como variáveis ou referências a variáveis como parâmetros do membro função.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;Dadas as definições acima, podemos afirmar que:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Os &lt;strong&gt;parâmetros&lt;/strong&gt; sempre tiveram, e continua a ter, nome.&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Os &lt;strong&gt;parâmetros&lt;/strong&gt; nunca foram, e continuam a não ser, opcionais.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;Argumentos Com Nome&lt;/h4&gt;  &lt;p align="justify"&gt;Até agora, a forma como o compilador de &lt;strong&gt;C#&lt;/strong&gt; fazia corresponder os argumentos da declaração de uma chamada a um método era pela sua posição. O primeiro argumento providencia o valor para o primeiro parâmetro o segundo argumento providencia o valor para o segundo parâmetro, e por aí fora, independentemente do número de parâmetros. Se algum parâmetro não tivesse um argumento correspondente para lhe providenciar o valor, isso faria o compilador emitir um erro de compilação.&lt;/p&gt;  &lt;p align="justify"&gt;Para esta chamada:&lt;/p&gt;  &lt;pre class="code"&gt;Greeting(&lt;span style="color:#a31515;"&gt;&amp;quot;Mr.&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;Morgado&amp;quot;, 42&lt;/span&gt;);&lt;/pre&gt;

&lt;p align="justify"&gt;este métdo:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public void &lt;/span&gt;Greeting(&lt;span style="color:blue;"&gt;string &lt;/span&gt;title, &lt;span style="color:blue;"&gt;string &lt;/span&gt;name, &lt;span style="color:blue;"&gt;int &lt;/span&gt;age)&lt;span style="color:green;"&gt;
&lt;/span&gt;&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;receberá como parâmetros:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;strong&gt;title&lt;/strong&gt;: “Mr.”&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;strong&gt;name&lt;/strong&gt;: “Morgado”&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;strong&gt;age&lt;/strong&gt;: 42&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;O que esta nova funcionalidade permite é usar os nomes dos parâmteros para identificar os argumentos correspondentes na forma: &lt;em&gt;name&lt;/em&gt;&lt;strong&gt;:&lt;/strong&gt;&lt;em&gt;value&lt;/em&gt;&lt;/p&gt;

&lt;p align="justify"&gt;Nem todos os argumentos da lista precisam de ser identificados com o nome do correspondente parâmetros. No entanto, todos os argumentos com nome devem ser posicionados no fim da lista de argumentos. A correspondência entre os argumentos (e a avaliação do seu valor) e os parâmetros será feita primeiro pelo nome dos argumentos com nome (apesar destes se encontrarem no fim da lista) e em seguida pela posição, para os parâmteros para os quais ainda não foi atribuído valor.&lt;/p&gt;

&lt;p align="justify"&gt;Isto quer dizer que, para esta definição de método:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public void &lt;/span&gt;Method(&lt;span style="color:blue;"&gt;int &lt;/span&gt;first, &lt;span style="color:blue;"&gt;int &lt;/span&gt;second, &lt;span style="color:blue;"&gt;int &lt;/span&gt;third)&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;esta declaração de chamada:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;int &lt;/span&gt;i = 0;
Method(i, third: i++, second: ++i);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;terá o seguinte código gerado pelo compilador:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;int &lt;/span&gt;i = 0;
&lt;span style="color:blue;"&gt;int &lt;/span&gt;CS$0$0000 = i++;
&lt;span style="color:blue;"&gt;int &lt;/span&gt;CS$0$0001 = ++i;
Method(i, CS$0$0001, CS$0$0000);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;o que dará aos parâmetros do método os seguintes valores:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;first&lt;/strong&gt;: 2 &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;second&lt;/strong&gt;: 2 &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;third&lt;/strong&gt;: 0 &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;Note-se que os nomes das variáveis geradas pelo compilador não são identificadores &lt;strong&gt;C#&lt;/strong&gt; válidos. No entanto, são identificadores &lt;a title="Microsoft .NET Framework" href="http://www.microsoft.com/net/" target="_blank"&gt;&lt;strong&gt;.NET&lt;/strong&gt;&lt;/a&gt; válidos evitando, assim, colisões de nomes entre o código gerado pelo compilador e o código escrito pelo programador.&lt;/p&gt;

&lt;p align="justify"&gt;Para além de permitir reordenar a lista de argumentos, esta funcionalidade apresenta-se muito útil para documentar código que quando, por exemplo, a lista de argumentos é muito extensa ou é pouco claro o significado dos argumentos na declaração da chamada ao método.&lt;/p&gt;

&lt;h4&gt;Argumentos Opcionais&lt;/h4&gt;

&lt;p align="justify"&gt;Agora os parâmetros pode ter valores por omissão:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public void &lt;/span&gt;Method(&lt;span style="color:blue;"&gt;int &lt;/span&gt;first, &lt;span style="color:blue;"&gt;int &lt;/span&gt;second = 2, &lt;span style="color:blue;"&gt;int &lt;/span&gt;third = 3)&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Os parâmetros com valores por omissão têm de ser os últimos da lista de parâmetros e esse valor é usado se o argumento correspondente estiver em falta na lista de argumentos da declaração da chamado ao método.&lt;/p&gt;

&lt;p align="justify"&gt;Para esta declaração de chamada:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;int &lt;/span&gt;i = 0;
Method(i, third: ++i);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;terá o seguinte código gerado pelo compilador:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;int &lt;/span&gt;i = 0;
&lt;span style="color:blue;"&gt;int &lt;/span&gt;CS$0$0000 = ++i;
Method(i, 2, CS$0$0000);&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;o que dará aos parâmetros do método os seguintes valores:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;first&lt;/strong&gt;: 1 &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;second&lt;/strong&gt;: 2 &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;third&lt;/strong&gt;: 1 &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;Porque, quando os parâmetros do método têm valores por omissão, os arumentos podem ser omitidos na declaração da chamada ao método, pode parecer-se com sobreposição de métodos, mas não é.&lt;/p&gt;

&lt;p align="justify"&gt;Embora métodos como este:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;StreamReader &lt;/span&gt;OpenTextFile(
    &lt;span style="color:blue;"&gt;string &lt;/span&gt;path,
    &lt;span style="color:#2b91af;"&gt;Encoding &lt;/span&gt;encoding = &lt;span style="color:blue;"&gt;null&lt;/span&gt;,
    &lt;span style="color:blue;"&gt;bool &lt;/span&gt;detectEncoding = &lt;span style="color:blue;"&gt;true&lt;/span&gt;,
    &lt;span style="color:blue;"&gt;int &lt;/span&gt;bufferSize = 1024)&lt;/pre&gt;

&lt;p align="justify"&gt;permitam que as sua chamadas sejam escritas assim:&lt;/p&gt;

&lt;pre class="code"&gt;OpenTextFile(&lt;span style="color:#a31515;"&gt;&amp;quot;foo.txt&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;Encoding&lt;/span&gt;.UTF8);
OpenTextFile(&lt;span style="color:#a31515;"&gt;&amp;quot;foo.txt&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;Encoding&lt;/span&gt;.UTF8, bufferSize: 4096);
OpenTextFile(
    bufferSize: 4096,
    path: &lt;span style="color:#a31515;"&gt;&amp;quot;foo.txt&amp;quot;&lt;/span&gt;,
    detectEncoding: &lt;span style="color:blue;"&gt;false&lt;/span&gt;);&lt;/pre&gt;

&lt;p align="justify"&gt;O compilador trata os valores por omissão como trata os campos constantes tomando o seu valor e usando-o em vez de uma referência ao valor. Portanto, tal como com os campos constantes, os métodos com parâmetros com valores por omissão não devem ser expostos publicamente (não esquecer que membros internos podem ser aceiddos publicamente – &lt;a title="InternalsVisibleToAttribute Class" href="http://msdn.microsoft.com/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx" target="_blank"&gt;InternalsVisibleToAttribute&lt;/a&gt;). Se tais métodos forem acedidos publicamente por outra &lt;em&gt;assemby&lt;/em&gt;, esses valores serão codificados no código chamador e, se a &lt;em&gt;assembly&lt;/em&gt; chamada tiver esses valores modificados, essa modificação não se reflectirá no código já compilado.&lt;/p&gt;

&lt;p align="justify"&gt;À primeira vista, pensei que usar os argumentos opcionais para chamar “mau” código era bom, mas a possibilidade de definir esse tipo de métodos era terrível. Mas depois apercebi-me que, uma vez que uso campos constantes, não será mau usar métodos com parâmetros com valores por omissão pra métodos de acesso privado.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/16/c-4-0-argumentos-com-nome-e-opcionais.aspx&amp;amp;;subject=C%23+4.0%3a+Argumentos+Com+Nome+E+Opcionais" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/16/c-4-0-argumentos-com-nome-e-opcionais.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/16/c-4-0-argumentos-com-nome-e-opcionais.aspx&amp;amp;;title=C%23+4.0%3a+Argumentos+Com+Nome+E+Opcionais" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/16/c-4-0-argumentos-com-nome-e-opcionais.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/16/c-4-0-argumentos-com-nome-e-opcionais.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/16/c-4-0-argumentos-com-nome-e-opcionais.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/16/c-4-0-argumentos-com-nome-e-opcionais.aspx&amp;amp;title=C%23+4.0%3a+Argumentos+Com+Nome+E+Opcionais" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/16/c-4-0-argumentos-com-nome-e-opcionais.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/16/c-4-0-argumentos-com-nome-e-opcionais.aspx&amp;amp;;title=C%23+4.0%3a+Argumentos+Com+Nome+E+Opcionais" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/16/c-4-0-argumentos-com-nome-e-opcionais.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/16/c-4-0-argumentos-com-nome-e-opcionais.aspx&amp;amp;;title=C%23+4.0%3a+Argumentos+Com+Nome+E+Opcionais&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/16/c-4-0-argumentos-com-nome-e-opcionais.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=58200" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET+/default.aspx">.NET </category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Eventos/default.aspx">Eventos</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Desenvolvimento/default.aspx">Desenvolvimento</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TechDays/default.aspx">TechDays</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET3.5/default.aspx">.NET3.5</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TechDaysPT10/default.aspx">TechDaysPT10</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/C_2300_4.0/default.aspx">C#4.0</category></item><item><title>C# 4.0: Covari&amp;#226;ncia E Contravari&amp;#226;ncia Em Gen&amp;#233;ricos - Simplificado</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/15/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos-simplificado.aspx</link><pubDate>Wed, 14 Apr 2010 23:58:50 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:58168</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><description>&lt;p align="justify"&gt;Na minha última &lt;a title="C# 4.0: Covariância E Contravariância Em Genéricos" href="http://paulomorgado.net/pt/blog/archive/2010/04/13/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos.aspx" target="_blank"&gt;entrada&lt;/a&gt;, percorri o que é a variância em &lt;a title="Microsoft .NET Framework" href="http://www.microsoft.com/net/" target="_blank"&gt;.NET&lt;/a&gt; 4.0 e &lt;a title="Microsoft Visual C#" href="http://csharp.net/" target="_blank"&gt;C#&lt;/a&gt; 4.0 de uma form algo teórica.&lt;/p&gt;  &lt;p align="justify"&gt;Desta vez vou tentar ser mais terra a terra.&lt;/p&gt;  &lt;p align="justify"&gt;Dados:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Base &lt;/span&gt;{ }

&lt;span style="color:blue;"&gt;class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Derived &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;Base &lt;/span&gt;{ }&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Em que:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;Trace&lt;/span&gt;.Assert(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Base&lt;/span&gt;).IsClass &amp;amp;&amp;amp; &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Derived&lt;/span&gt;).IsClass &amp;amp;&amp;amp; &lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Base&lt;/span&gt;).IsGreaterOrEqualTo(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;Derived&lt;/span&gt;)));&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div&gt;&lt;strong&gt;Covariância&lt;/strong&gt;&lt;/div&gt;

    &lt;br /&gt;

    &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ICovariantIn&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;out &lt;/span&gt;T&amp;gt; { }&lt;/pre&gt;

    &lt;br /&gt;

    &lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;Trace&lt;/span&gt;.Assert(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;ICovariantIn&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Base&lt;/span&gt;&amp;gt;).IsGreaterOrEqualTo(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;ICovariantIn&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Derived&lt;/span&gt;&amp;gt;)));&lt;/pre&gt;
    &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

    &lt;br /&gt;&lt;/li&gt;

  &lt;li&gt;
    &lt;div&gt;&lt;strong&gt;Contravâriancia&lt;/strong&gt;&lt;/div&gt;

    &lt;br /&gt;

    &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IContravariantIn&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;in &lt;/span&gt;T&amp;gt; { }&lt;/pre&gt;
    &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

    &lt;br /&gt;

    &lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;Trace&lt;/span&gt;.Assert(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;IContravariantIn&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Derived&lt;/span&gt;&amp;gt;).IsGreaterOrEqualTo(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;IContravariantIn&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Base&lt;/span&gt;&amp;gt;)));&lt;/pre&gt;
    &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

    &lt;br /&gt;&lt;/li&gt;

  &lt;li&gt;
    &lt;div&gt;&lt;strong&gt;Invariância&lt;/strong&gt;&lt;/div&gt;

    &lt;br /&gt;

    &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IInvariantIn&lt;/span&gt;&amp;lt;T&amp;gt; { }&lt;/pre&gt;
    &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

    &lt;br /&gt;

    &lt;pre class="code"&gt;&lt;span style="color:#2b91af;"&gt;Trace&lt;/span&gt;.Assert(!&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;IInvariantIn&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Base&lt;/span&gt;&amp;gt;).IsGreaterOrEqualTo(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;IInvariantIn&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Derived&lt;/span&gt;&amp;gt;))
    &amp;amp;&amp;amp; !&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;IInvariantIn&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Derived&lt;/span&gt;&amp;gt;).IsGreaterOrEqualTo(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;IInvariantIn&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Base&lt;/span&gt;&amp;gt;)));&lt;/pre&gt;
    &lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Onde:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;TypeExtensions
&lt;/span&gt;{
    &lt;span style="color:blue;"&gt;public static bool &lt;/span&gt;IsGreaterOrEqualTo(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Type &lt;/span&gt;self, &lt;span style="color:#2b91af;"&gt;Type &lt;/span&gt;other)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;self.IsAssignableFrom(other);
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/15/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos-simplificado.aspx&amp;amp;;subject=C%23+4.0%3a+Covari%26amp%3b%23226%3bncia+E+Contravari%26amp%3b%23226%3bncia+Em+Gen%26amp%3b%23233%3bricos+-+Simplificado" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/15/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos-simplificado.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/15/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos-simplificado.aspx&amp;amp;;title=C%23+4.0%3a+Covari%26amp%3b%23226%3bncia+E+Contravari%26amp%3b%23226%3bncia+Em+Gen%26amp%3b%23233%3bricos+-+Simplificado" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/15/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos-simplificado.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/15/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos-simplificado.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/15/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos-simplificado.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/15/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos-simplificado.aspx&amp;amp;title=C%23+4.0%3a+Covari%26amp%3b%23226%3bncia+E+Contravari%26amp%3b%23226%3bncia+Em+Gen%26amp%3b%23233%3bricos+-+Simplificado" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/15/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos-simplificado.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/15/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos-simplificado.aspx&amp;amp;;title=C%23+4.0%3a+Covari%26amp%3b%23226%3bncia+E+Contravari%26amp%3b%23226%3bncia+Em+Gen%26amp%3b%23233%3bricos+-+Simplificado" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/15/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos-simplificado.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/15/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos-simplificado.aspx&amp;amp;;title=C%23+4.0%3a+Covari%26amp%3b%23226%3bncia+E+Contravari%26amp%3b%23226%3bncia+Em+Gen%26amp%3b%23233%3bricos+-+Simplificado&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/15/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos-simplificado.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=58168" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET+/default.aspx">.NET </category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Desenvolvimento/default.aspx">Desenvolvimento</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TechDays/default.aspx">TechDays</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TechDaysPT10/default.aspx">TechDaysPT10</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/C_2300_4.0/default.aspx">C#4.0</category></item><item><title>C# 4.0: Covari&amp;#226;ncia E Contravari&amp;#226;ncia Em Gen&amp;#233;ricos</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/13/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos.aspx</link><pubDate>Tue, 13 Apr 2010 01:26:28 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:58133</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><description>&lt;p align="justify"&gt;O &lt;a title="Microsoft Visual C#" href="http://csharp.net/" target="_blank"&gt;C#&lt;/a&gt; 4.0 (e a &lt;a title="Microsoft .NET Framework" href="https://www.microsoft.com/net/" target="_blank"&gt;.NET&lt;/a&gt; 4.0) introduziram &lt;strong&gt;covariância&lt;/strong&gt; e &lt;strong&gt;contravariância&lt;/strong&gt; em interfaces e &lt;em&gt;delegates&lt;/em&gt; genericos. Mas afinal o que é a variância?&lt;/p&gt;  &lt;p align="justify"&gt;Segundo a &lt;a title="Wikipedia, a enciclopédia livre" href="http://pt.wikipedia.org/" target="_blank"&gt;Wikipedia&lt;/a&gt;, em álgebra multilinear, &lt;b&gt;covariância&lt;/b&gt; e &lt;b&gt;contravariância&lt;/b&gt; descrevem como a descrição quantitativa de certas entidades geométricas ou físicas variam quando passam de um systema de coordenadas para outro.&lt;sup&gt;&lt;a title="Covariância and contravariância of vectors (Inglês)" href="http://en.wikipedia.org/wiki/Covari&amp;acirc;ncia_and_contravari&amp;acirc;ncia_of_vectors" target="_blank"&gt;(*)&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Mas o que é que isto tem a ver com &lt;strong&gt;C#&lt;/strong&gt; ou &lt;strong&gt;.NET&lt;/strong&gt;?&lt;/p&gt;  &lt;p align="justify"&gt;Na teoria de tipos, um tipo &lt;strong&gt;T&lt;/strong&gt; é maior (&lt;strong&gt;&amp;gt;&lt;/strong&gt;) que o tipo &lt;strong&gt;S&lt;/strong&gt; se &lt;strong&gt;S&lt;/strong&gt; é um subtipo (deriva) de &lt;strong&gt;T&lt;/strong&gt;, o que quer dizer que existe uma descrição quantitativa para tipos numa hierarquia de tipos.&lt;/p&gt;  &lt;p align="justify"&gt;Sendo assim, como é que a &lt;strong&gt;covariância&lt;/strong&gt; e a &lt;strong&gt;contravariância&lt;/strong&gt; se aplicam aos tipos genéricos do &lt;strong&gt;C#&lt;/strong&gt; (e de &lt;strong&gt;.NET&lt;/strong&gt;)?&lt;/p&gt;  &lt;p align="justify"&gt;Em &lt;strong&gt;C#&lt;/strong&gt; (e em &lt;strong&gt;.NET&lt;/strong&gt;), variância é uma relação entre uma definição de tipo genérico e um determinado tipo parâmetro de genéricos.&lt;/p&gt;  &lt;p align="justify"&gt;Dados dois tipos &lt;strong&gt;Base&lt;/strong&gt; e &lt;strong&gt;Derivado&lt;/strong&gt;, em que:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Existe uma conversão por referência (ou identidade) entre &lt;strong&gt;Base&lt;/strong&gt; e &lt;strong&gt;Derivado&lt;/strong&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;&lt;strong&gt;Base&lt;/strong&gt; ≥&lt;/strong&gt;&amp;#160;&lt;strong&gt;Derivado&lt;/strong&gt;&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Uma definição de tipo genérico &lt;strong&gt;&lt;strong&gt;Genérico&lt;/strong&gt;&amp;lt;T&amp;gt;&lt;/strong&gt; é:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p align="justify"&gt;&lt;strong&gt;covariante em T&lt;/strong&gt; se a ordem dos tipos construídos segue a ordem dos tipos parâmetros de genéricos : &lt;strong&gt;Genérico&amp;lt;&lt;strong&gt;&lt;strong&gt;Base&lt;/strong&gt;&lt;/strong&gt;&amp;gt; ≥ Genérico&amp;lt;&lt;strong&gt;Derivado&lt;/strong&gt;&amp;gt;&lt;/strong&gt; &lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;contravariante em T&lt;/strong&gt; se a ordem dos tipos construídos é inversa à ordem dos tipos parâmetros de genéricos : &lt;strong&gt;Genérico&amp;lt;&lt;strong&gt;&lt;strong&gt;Base&lt;/strong&gt;&lt;/strong&gt;&amp;gt; &lt;strong&gt;≤&lt;/strong&gt; Genérico&amp;lt;&lt;strong&gt;Derivado&lt;/strong&gt;&amp;gt;&lt;/strong&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;&lt;strong&gt;invariante em T&lt;/strong&gt; se nenhuma das regras acima se aplica.&lt;/div&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Se aplicarmos a definição a &lt;em&gt;arrays&lt;/em&gt;, podemos constatar que os &lt;em&gt;arrays&lt;/em&gt; sempre foram covariantes porque este código é válido:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;object&lt;/span&gt;[] objectArray = &lt;span style="color:blue;"&gt;new string&lt;/span&gt;[] { &lt;span style="color:#a31515;"&gt;&amp;quot;string 1&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;string 2&amp;quot; &lt;/span&gt;};
objectArray[0] = &lt;span style="color:#a31515;"&gt;&amp;quot;string 3&amp;quot;&lt;/span&gt;;&lt;span style="color:green;"&gt;
&lt;/span&gt;objectArray[1] = &lt;span style="color:blue;"&gt;new object&lt;/span&gt;();&lt;span style="color:green;"&gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p align="justify"&gt;Contudo, quando tentamos correr este código, a segunda afectação vai lançar uma &lt;a title="ArrayTypeMismatchException Class" href="http://msdn.microsoft.com/library/system.arraytypemismatchexception.aspx" target="_blank"&gt;ArrayTypeMismatchException&lt;/a&gt;. Apesar do compilador ter sido enganado para pensar que o código era válido porque um &lt;strong&gt;object&lt;/strong&gt; está a ser atribuído a um elemento de um &lt;em&gt;array&lt;/em&gt; de &lt;strong&gt;object&lt;/strong&gt;, em tempo de execução, há sempre uma verificação de tipos para garantir que o tipo em tempo de execução da definição dos elementos do &lt;em&gt;array&lt;/em&gt; é maior ou igual ao da instância quie está a ser atribuída ao elemento. No exemplo acima, porque o tipo em tempo de execução é &lt;strong&gt;array de string&lt;/strong&gt;, a primeira afectação de elementos é válida porque &lt;strong&gt;string ≥&lt;/strong&gt; &lt;strong&gt;string&lt;/strong&gt; e a segunda não é válida porque &lt;strong&gt;string ≤&lt;/strong&gt; &lt;strong&gt;object&lt;/strong&gt;.&lt;/p&gt;

&lt;p align="justify"&gt;Isto leva-nos à conclusão de que, apesar dos &lt;em&gt;arrays&lt;/em&gt; sempre terem sido covariantes, não são covariantes sem riscos – não é garantido que código que compila corra sem erros.&lt;/p&gt;

&lt;p align="justify"&gt;Em &lt;strong&gt;C#&lt;/strong&gt;, a variância em relação&amp;#160; um determinado tipo parâmetro de genéricos é forçada na declaração e não determinada pelo uso desse tipo parâmero de genéricos.&lt;/p&gt;

&lt;p align="justify"&gt;A &lt;strong&gt;covariância&lt;/strong&gt; em relação a um determinado tipo parâmetro de genéricos é forçada através do &lt;a title="out (Generic Modifier) (C# Reference)" href="http://msdn.microsoft.com/library/dd469487(VS.100).aspx" target="_blank"&gt;modificador genérico out&lt;/a&gt;:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;out &lt;/span&gt;T&amp;gt;
{
    &lt;span style="color:#2b91af;"&gt;IEnumerator&lt;/span&gt;&amp;lt;T&amp;gt; GetEnumerator();
}

&lt;span style="color:blue;"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerator&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;out &lt;/span&gt;T&amp;gt;
{
    T Current { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; }
    &lt;span style="color:blue;"&gt;bool &lt;/span&gt;MoveNext();
}&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Note-se o conveniente uso da palavra reservada &lt;strong&gt;out&lt;/strong&gt; já existente. Além do benefício de não nos termos de lembrar de uma nova hipotética palavra reservada &lt;strong&gt;covariant&lt;/strong&gt;, &lt;strong&gt;out&lt;/strong&gt; (saída) é mais fácil de lembrar porque define que o tipo parâmetro de genéricos apenas pode ser usando em posições de saída — propriedades apenas de leitura e valores de saída de métodos.&lt;/p&gt;

&lt;p align="justify"&gt;Similarmente, a &lt;strong&gt;contravariância&lt;/strong&gt; em relação a um determinado tipo parâmetro de genéricos é forçada através do &lt;a title="in (Generic Modifier) (C# Reference)" href="http://msdn.microsoft.com/library/dd469484(v=VS.100).aspx" target="_blank"&gt;modificador genérico in&lt;/a&gt;:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IComparer&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;in &lt;/span&gt;T&amp;gt;
{
    &lt;span style="color:blue;"&gt;int &lt;/span&gt;Compare(T x, T y);
}&lt;/pre&gt;

&lt;p align="justify"&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Mais uma vez, o uso da palavra reservada &lt;strong&gt;in&lt;/strong&gt; (entrada) já existente é mais fácil de lembrar keyporque define que o tipo parâmetro de genéricos apenas pode ser usando em posições de entrada — propriedades apenas de escrita e parâmetros de métodos que não sejam por referência (&lt;strong&gt;ref&lt;/strong&gt;) nem de saída (&lt;strong&gt;out&lt;/strong&gt;).&lt;/p&gt;

&lt;p align="justify"&gt;Um tipo parâmetro de genéricos que não seja marcado &lt;strong&gt;covariante&lt;/strong&gt; (&lt;strong&gt;out&lt;/strong&gt;) ou &lt;strong&gt;contravariante&lt;/strong&gt; (&lt;strong&gt;in&lt;/strong&gt;) é &lt;strong&gt;invariante&lt;/strong&gt;.&lt;/p&gt;

&lt;p align="justify"&gt;Porque a &lt;strong&gt;variância&lt;/strong&gt; se aplica à relação entre uma definição de tipo genérico e um determinado tipo parâmetro de genéricos, uma definição de tipo genérico pode ser &lt;strong&gt;covariante&lt;/strong&gt;, &lt;strong&gt;contravariante&lt;/strong&gt;, &lt;strong&gt;invariante&lt;/strong&gt; dependendo do tipo parâmetro genérico.&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public delegate &lt;/span&gt;TResult &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;in &lt;/span&gt;T, &lt;span style="color:blue;"&gt;out &lt;/span&gt;TResult&amp;gt;(T arg);&lt;/pre&gt;

&lt;p align="justify"&gt;Na definição do delegate genérico acima, &lt;strong&gt;Func&amp;lt;T, TResult&amp;gt;&lt;/strong&gt; é &lt;strong&gt;contravariant em T&lt;/strong&gt; e &lt;strong&gt;convariante em TResult&lt;/strong&gt;.&lt;/p&gt;

&lt;p align="justify"&gt;Todos os tipos da &lt;a title="Microsoft .NET" href="http://cli.gs/cligs/Microsoft-NET" target="_blank"&gt;.NET Framework&lt;/a&gt; onde a variância podia ser aplicada foram alterados para que os seus tipos parâmetros de genéricos pudessem tirar partido desta funcionalidade.&lt;/p&gt;

&lt;p align="justify"&gt;Em resumo, as regras da variância em &lt;strong&gt;C#&lt;/strong&gt; (e &lt;strong&gt;.NET&lt;/strong&gt;) são:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;A variância em relação a tipos parâmetros de genéricos está restringida aos tipos interfaces genéricas e &lt;em&gt;delegates&lt;/em&gt; genéricos.&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;Uma interface genérica ou um &lt;em&gt;delegate&lt;/em&gt; genérico podem ser, em simultâneo &lt;strong&gt;covariante&lt;/strong&gt;, &lt;strong&gt;contravariante&lt;/strong&gt; ou &lt;strong&gt;invariante&lt;/strong&gt; em relação a diferentes tipos parâmetros de genéricos.&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;A variância aplica-se apenas a tipos referência: um &lt;strong&gt;IEnumerable&amp;lt;int&amp;gt;&lt;/strong&gt; não é um &lt;strong&gt;IEnumerable&amp;lt;object&amp;gt;&lt;/strong&gt;.&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;A variância não se aplica à combinação de &lt;em&gt;delegates&lt;/em&gt;. Isto é, dados dois &lt;em&gt;delegates&lt;/em&gt; do tipo &lt;strong&gt;Action&amp;lt;Derived&amp;gt;&lt;/strong&gt; e &lt;strong&gt;Action&amp;lt;Base&amp;gt;&lt;/strong&gt;, não é possível combinar o segundo &lt;em&gt;delegate&lt;/em&gt; com o primeiro apesar de que o resulado ser seguro do ponto de vista do tipo. A variância permite que o segundo &lt;em&gt;delegate&lt;/em&gt; seja atribuído a uma variável do tipo &lt;strong&gt;Action&amp;lt;Derived&amp;gt;&lt;/strong&gt;, mas os &lt;em&gt;delegates&lt;/em&gt; apenas podem ser combinados se os seus tipos forem uma correspondência exacta.&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p align="justify"&gt;Quem desejar aprender mais acerca da variância em &lt;strong&gt;C#&lt;/strong&gt; (e &lt;strong&gt;.NET&lt;/strong&gt;), pode ler:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;a title="Covarince and Contravariance in Generics" href="http://msdn.microsoft.com/library/dd799517(VS.100).aspx" target="_blank"&gt;Covarince and Contravariance in Generics&lt;/a&gt; — &lt;a title="MSDN Library" href="http://msdn.microsoft.com/library" target="_blank"&gt;MSDN Library&lt;/a&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;a title="Exact rules for variance validity" href="http://blogs.msdn.com/ericlippert/archive/2009/12/03/exact-rules-for-vari&amp;acirc;ncia-validity.aspx" target="_blank"&gt;Exact rules for variance validity&lt;/a&gt; — &lt;a title="Eric Lippert&amp;#39;s Fabulous Adventures In Coding" href="http://blogs.msdn.com/ericlippert/default.aspx" target="_blank"&gt;Eric Lippert&lt;/a&gt;&lt;/div&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;div align="justify"&gt;&lt;a title="Events get a little overhaul in C# 4, Afterward: Effective Events" href="http://blogs.msdn.com/cburrows/archive/2010/03/30/events-get-a-little-overhaul-in-c-4-afterward-effective-events.aspx" target="_blank"&gt;Events get a little overhaul in C# 4, Afterward: Effective Events&lt;/a&gt; — &lt;a title="Chris Burrows&amp;#39; Blog" href="http://blogs.msdn.com/cburrows/default.aspx" target="_blank"&gt;Chris Burrows&lt;/a&gt;&lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Por a variância ser uma funcionalidade da &lt;strong&gt;.NET 4.0&lt;/strong&gt; e não apenas do &lt;strong&gt;C# 4.0&lt;/strong&gt;, estes conceitos também se aplicam ao &lt;a title="Visual Basic Developer Center" href="http://msdn.microsoft.com/vbasic/" target="_blank"&gt;Visual Basic&lt;/a&gt; 10.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/13/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos.aspx&amp;amp;;subject=C%23+4.0%3a+Covari%26amp%3b%23226%3bncia+E+Contravari%26amp%3b%23226%3bncia+Em+Gen%26amp%3b%23233%3bricos" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/13/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/13/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos.aspx&amp;amp;;title=C%23+4.0%3a+Covari%26amp%3b%23226%3bncia+E+Contravari%26amp%3b%23226%3bncia+Em+Gen%26amp%3b%23233%3bricos" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/13/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/13/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/13/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/13/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos.aspx&amp;amp;title=C%23+4.0%3a+Covari%26amp%3b%23226%3bncia+E+Contravari%26amp%3b%23226%3bncia+Em+Gen%26amp%3b%23233%3bricos" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/13/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/13/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos.aspx&amp;amp;;title=C%23+4.0%3a+Covari%26amp%3b%23226%3bncia+E+Contravari%26amp%3b%23226%3bncia+Em+Gen%26amp%3b%23233%3bricos" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/13/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/13/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos.aspx&amp;amp;;title=C%23+4.0%3a+Covari%26amp%3b%23226%3bncia+E+Contravari%26amp%3b%23226%3bncia+Em+Gen%26amp%3b%23233%3bricos&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/13/c-4-0-covari-226-ncia-e-contravari-226-ncia-em-gen-233-ricos.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=58133" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET+/default.aspx">.NET </category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Eventos/default.aspx">Eventos</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Desenvolvimento/default.aspx">Desenvolvimento</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TechDays/default.aspx">TechDays</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TechDaysPT10/default.aspx">TechDaysPT10</category></item><item><title>A Evolu&amp;#231;&amp;#227;o Do C#</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/12/a-evolu-231-227-o-do-c.aspx</link><pubDate>Mon, 12 Apr 2010 01:08:48 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:58129</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><description>&lt;p align="justify"&gt;&lt;img style="border-bottom:1px solid;border-left:1px solid;margin:0px 0px 10px 10px;display:inline;border-top:1px solid;border-right:1px solid;" title="A Evolução Do C#" border="1" alt="The Evolution Of C#" align="right" src="http://lh6.ggpht.com/_PEyUx0qf5g0/S8OQ6lswVnI/AAAAAAAAAEU/8JaqgaSc0Mc/A%20Evolu%C3%A7%C3%A3o%20Do%20C%23.png.jpg" width="600" height="360" /&gt;A primeira versão do &lt;a title="Microsoft Visual C#" href="http://csharp.net" target="_blank"&gt;C#&lt;/a&gt; (&lt;strong&gt;C# 1.0&lt;/strong&gt;) foi, essencialmente, o desenvolvimento de uma linguagem de programação para código gerido (&lt;em&gt;managed code&lt;/em&gt;) que apelasse, pricipalmente, a programadores de &lt;a title="C++ Programming Language" href="http://en.wikipedia.org/wiki/C%2B%2B" target="_blank"&gt;C++&lt;/a&gt; e &lt;a title="Java Programming Language" href="http://en.wikipedia.org/wiki/Java_(programming_language)" target="_blank"&gt;Java&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Com a segunda versão (&lt;strong&gt;C# 2.0&lt;/strong&gt;) pretendeu-se colmatar as falhas da primeria versão adicionado o que não tinha tido tempo de ser incluído. A principal funcionalidade desta versão foram os &lt;a title="Generics (C# Programming Guide)" href="http://msdn.microsoft.com/library/512aeb7t.aspx" target="_blank"&gt;Genéricos&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Na terceira versão (&lt;strong&gt;C# 3.0&lt;/strong&gt;) pretendeu-se reduzir a dissonância entre as linguagens de programação de uso geral e as base de dados. Para alcaçar este objectivo, foram adicionadas algumas funcionalidades da programação funcional e nascia o &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Novas tendências estão a aparecer na industria e as linguagens de programação modernas necessitam de ser mais:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;div align="justify"&gt;Declarativas&lt;/div&gt;      &lt;p align="justify"&gt;Com as linguagens imperativas, mesmo sem deixar de ter em conta o &lt;strong&gt;quê&lt;/strong&gt;, os programas têm de se focar no &lt;strong&gt;como&lt;/strong&gt;. Isto leva à sobre-especificação da solução para o problema em mãos, tornando praticamente impossível ao motor de execução ser suficientemente esperto para optimizar a execução do programa e executá-lo mais eficientemente (parar o &lt;em&gt;hardware&lt;/em&gt; disponível, por exemplo).&lt;/p&gt;      &lt;p align="justify"&gt;As linguagens declarativas, por outro lado, focam-se no &lt;strong&gt;quê&lt;/strong&gt; e deixam o &lt;strong&gt;como&lt;/strong&gt; ao motor de execução. O &lt;strong&gt;LINQ&lt;/strong&gt; tornou o &lt;strong&gt;C#&lt;/strong&gt; mais declarativo usando instrucções de alto nível como &lt;a title="orderby clause (C# Reference)" href="http://msdn.microsoft.com/library/bb383982.aspx" target="_blank"&gt;orderby&lt;/a&gt; e &lt;a title="group clause (C# Reference)" href="http://msdn.microsoft.com/library/bb384063.aspx" target="_blank"&gt;group by&lt;/a&gt; que dão ao motor de execução mais chances de uma melhor optimização da execução (paralelizando-a, por exemplo).&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Concorrentes&lt;/div&gt;      &lt;p align="justify"&gt;A concorrência é muito difícil e necessita de ser bem pensada o que a torna muito difícil de “enfiar” numa linguagem de programação. O &lt;a title="Parallel Class" href="http://msdn.microsoft.com/library/system.threading.tasks.parallel.aspx" target="_blank"&gt;Parallel&lt;/a&gt;.&lt;a title="Parallel.For Method" href="http://msdn.microsoft.com/library/dd783539(v=VS.100).aspx" target="_blank"&gt;For&lt;/a&gt; (das &lt;a title="Parallel Programming in the .NET Framework" href="http://msdn.microsoft.com/library/dd460693.aspx" target="_blank"&gt;parallel extensions&lt;/a&gt;) tem o aspecto de um &lt;a title="for (C# Reference)" href="http://msdn.microsoft.com/library/ch45axte.aspx" target="_blank"&gt;for&lt;/a&gt; paralelo porque foi dada suficiente expressividade ao &lt;strong&gt;C# 3.0&lt;/strong&gt; para permitir utilizações destas sem ter se usar uma sintaxe específica da linguagem.&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div align="justify"&gt;Dinâmicas&lt;/div&gt;      &lt;p align="justify"&gt;Tem havido muito debate acerca qual o melhor tipo de linguagem de programação: &lt;strong&gt;estaticas&lt;/strong&gt; or &lt;strong&gt;dinâmicas&lt;/strong&gt;. O facto é que ambas têm boas qualidades e os utilizadores de ambas querem ter todas as funcionalidades à sua disposição.&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Todas estas novas tendências requerem uma mudança de paradigma. O &lt;strong&gt;C#&lt;/strong&gt; já é, em muitos aspectos, uma linguagem multi-paradigma.&amp;#160; Ainda é uma linguagem muito orientada a objectos (ou a classes, segundo algumas opiniões), mas pode-se argumentar que o &lt;strong&gt;C# 3.0&lt;/strong&gt; se tornou uma linguagem de programação funcional porque tem todas as bases do que uma linguagem de programação funcional necessita. De futuro, terá ainda mais.&lt;/p&gt;  &lt;p align="justify"&gt;Além da influência destas tendências, houve uma decisão de co-evolução das linguagens de programação &lt;strong&gt;C#&lt;/strong&gt; e &lt;a title="Visual Basic Developer Center" href="http://msdn.microsoft.com/vbasic/" target="_blank"&gt;Visual Basic&lt;/a&gt;. Desde o início que tem havido algum esforço em posicionar o &lt;strong&gt;C#&lt;/strong&gt; e o &lt;strong&gt;Visual Basic&lt;/strong&gt; em campos contrários e tentativas de justificar o que deve ser feito como uma ou outra linguagem de programação. Cada linguagem deve ser excolhida de de acordo com a experiência e familiaridade de programadores/equipas/projectos/empresas e não por qualquer funcionalidade em particular.&lt;/p&gt;  &lt;p align="justify"&gt;No passado, sempre que uma nova funcionalidade era adicioanda a uma das linguagens, os utilizadores da outra também a queriam para a sua lingaugem de opção. De futuro, sempre que uma funcionalidade for adicionada a uma das linguagens, a outra fará todos os esforços para também a adicionar. Ist não quer dizer que os &lt;a title="XML Literals Overview" href="http://msdn.microsoft.com/library/bb384629.aspx" target="_blank"&gt;literais XML&lt;/a&gt; serão adicionados ao &lt;strong&gt;C#&lt;/strong&gt; (porque se pode obter quase o mesmo com o &lt;a title="LINQ To XML" href="http://msdn.microsoft.com/library/bb387098.aspx" target="_blank"&gt;LINQ To XML&lt;/a&gt;), mas o &lt;strong&gt;Visual Basic&lt;/strong&gt; terá &lt;a title="Auto-Implemented Properties (Visual Basic)" href="http://msdn.microsoft.com/library/dd293589(VS.100).aspx" target="_blank"&gt;propriedades auto-implementadas&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;A quase totalidade destas funcionalidades requer ou é construída sobre funcionalidades da &lt;a title="Microsoft .NET Framework" href="http://www.microsoft.com/netframework/" target="_blank"&gt;.NET Framework&lt;/a&gt; e, o foco para o &lt;strong&gt;C# 4.0&lt;/strong&gt; foi a rogramação dinâmica. Não apenas tipos dinâmicos, mas a capacidade de falar com qualquer coisa que não seja uma classe&lt;strong&gt;.NET&lt;/strong&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Também introduzido com &lt;strong&gt;C# 4.0&lt;/strong&gt; é a co-variância e contra-variância para &lt;strong&gt;interfaces&lt;/strong&gt; e &lt;strong&gt;delegates&lt;/strong&gt; genéricos.&lt;/p&gt;  &lt;p align="justify"&gt;Fiquem atentos para mais sobre as novidades do &lt;strong&gt;C# 4.0&lt;/strong&gt; em entradas futuras.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/12/a-evolu-231-227-o-do-c.aspx&amp;amp;;subject=A+Evolu%26amp%3b%23231%3b%26amp%3b%23227%3bo+Do+C%23" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/12/a-evolu-231-227-o-do-c.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/12/a-evolu-231-227-o-do-c.aspx&amp;amp;;title=A+Evolu%26amp%3b%23231%3b%26amp%3b%23227%3bo+Do+C%23" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/12/a-evolu-231-227-o-do-c.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/12/a-evolu-231-227-o-do-c.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/12/a-evolu-231-227-o-do-c.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/12/a-evolu-231-227-o-do-c.aspx&amp;amp;title=A+Evolu%26amp%3b%23231%3b%26amp%3b%23227%3bo+Do+C%23" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/12/a-evolu-231-227-o-do-c.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/12/a-evolu-231-227-o-do-c.aspx&amp;amp;;title=A+Evolu%26amp%3b%23231%3b%26amp%3b%23227%3bo+Do+C%23" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/12/a-evolu-231-227-o-do-c.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/12/a-evolu-231-227-o-do-c.aspx&amp;amp;;title=A+Evolu%26amp%3b%23231%3b%26amp%3b%23227%3bo+Do+C%23&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/12/a-evolu-231-227-o-do-c.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=58129" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Eventos/default.aspx">Eventos</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Microsoft/default.aspx">Microsoft</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/MSDN/default.aspx">MSDN</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Desenvolvimento/default.aspx">Desenvolvimento</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TechDays/default.aspx">TechDays</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/TechDaysPT10/default.aspx">TechDaysPT10</category></item><item><title>LINQ: Melhorando Distinct Com O SelectorEqualityComparer</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/09/linq-melhorando-distinct-com-o-selectorequalitycomparer.aspx</link><pubDate>Fri, 09 Apr 2010 01:34:49 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:58110</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;&lt;a title="LINQ Com C#" 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 Com C#" align="right" src="http://www.fca.pt/ximages/722_547.gif" width="99" height="140" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Na minha &lt;a title="LINQ: Melhorando Distinct Com O PredicateEqualityComparer" href="http://paulomorgado.net/pt/blog/archive/2010/04/08/linq-melhorando-distinct-com-o-predicateequalitycomparer.aspx" target="_blank"&gt;última entrada&lt;/a&gt; apresentei o &lt;strong&gt;PredicateEqualityComparer&lt;/strong&gt; e um método de extensão &lt;a title="Distinct Method" href="http://msdn.microsoft.com/library/system.linq.enumerable.distinct.aspx" target="_blank"&gt;&lt;strong&gt;Distinct&lt;/strong&gt;&lt;/a&gt; recebe um predicado e cria internamente um &lt;strong&gt;PredicateEqualityComparer&lt;/strong&gt; para filtrar elementos.&lt;/p&gt;  &lt;p align="justify"&gt;Usar o predicado melhora a legibilidade, concisão e expressividade das consultas, mas ainda pode ser melhor. Na maioria dos casos, não queremos providenciar um método de comparação mas apenas extraír a chave de comparação dos elementos.&lt;/p&gt;  &lt;p align="justify"&gt;Por isso desenvolvi o &lt;strong&gt;SelectorEqualityComparer&lt;/strong&gt; que recebe um método para extraír a chave do elemento. Algo como isto:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SelectorEqualityComparer&lt;/span&gt;&amp;lt;TSource, Tkey&amp;gt; : &lt;span style="color:#2b91af;"&gt;EqualityComparer&lt;/span&gt;&amp;lt;TSource&amp;gt;
    &lt;span style="color:blue;"&gt;where &lt;/span&gt;Tkey : &lt;span style="color:#2b91af;"&gt;IEquatable&lt;/span&gt;&amp;lt;Tkey&amp;gt;
{
    &lt;span style="color:blue;"&gt;private &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TSource, Tkey&amp;gt; selector;

    &lt;span style="color:blue;"&gt;public &lt;/span&gt;SelectorEqualityComparer(&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TSource, Tkey&amp;gt; selector)
        : &lt;span style="color:blue;"&gt;base&lt;/span&gt;()
    {
        &lt;span style="color:blue;"&gt;this&lt;/span&gt;.selector = selector;
    }

    &lt;span style="color:blue;"&gt;public override bool &lt;/span&gt;Equals(TSource x, TSource y)
    {
        Tkey xKey = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.GetKey(x);
        Tkey yKey = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.GetKey(y);

        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(xKey != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
        {
            &lt;span style="color:blue;"&gt;return &lt;/span&gt;((yKey != &lt;span style="color:blue;"&gt;null&lt;/span&gt;) &amp;amp;&amp;amp; xKey.Equals(yKey));
        }

        &lt;span style="color:blue;"&gt;return &lt;/span&gt;(yKey == &lt;span style="color:blue;"&gt;null&lt;/span&gt;);
    }

    &lt;span style="color:blue;"&gt;public override int &lt;/span&gt;GetHashCode(TSource obj)
    {
        Tkey key = &lt;span style="color:blue;"&gt;this&lt;/span&gt;.GetKey(obj);

        &lt;span style="color:blue;"&gt;return &lt;/span&gt;(key == &lt;span style="color:blue;"&gt;null&lt;/span&gt;) ? 0 : key.GetHashCode();
    }

    &lt;span style="color:blue;"&gt;public override bool &lt;/span&gt;Equals(&lt;span style="color:blue;"&gt;object &lt;/span&gt;obj)
    {
        &lt;span style="color:#2b91af;"&gt;SelectorEqualityComparer&lt;/span&gt;&amp;lt;TSource, Tkey&amp;gt; comparer = obj &lt;span style="color:blue;"&gt;as &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SelectorEqualityComparer&lt;/span&gt;&amp;lt;TSource, Tkey&amp;gt;;
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;(comparer != &lt;span style="color:blue;"&gt;null&lt;/span&gt;);
    }

    &lt;span style="color:blue;"&gt;public override int &lt;/span&gt;GetHashCode()
    {
        &lt;span style="color:blue;"&gt;return base&lt;/span&gt;.GetType().Name.GetHashCode();
    }

    &lt;span style="color:blue;"&gt;private &lt;/span&gt;Tkey GetKey(TSource obj)
    {
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;(obj == &lt;span style="color:blue;"&gt;null&lt;/span&gt;) ? (Tkey)(&lt;span style="color:blue;"&gt;object&lt;/span&gt;)&lt;span style="color:blue;"&gt;null &lt;/span&gt;: &lt;span style="color:blue;"&gt;this&lt;/span&gt;.selector(obj);
    }
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Agora já posso escrever código como este:&lt;/p&gt;

&lt;pre class="code"&gt;.Distinct(&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SelectorEqualityComparer&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Source&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;Key&lt;/span&gt;&amp;gt;(x =&amp;gt; x.Field))&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;E, para uma melhor legibilidade, concisão e expressividade e suporte para &lt;a title="Anonymous Types (C# Programming Guide)" href="http://msdn.microsoft.com/library/bb397696.aspx" target="_blank"&gt;tipos anónimos&lt;/a&gt;:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TSource&amp;gt; Distinct&amp;lt;TSource, TKey&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TSource&amp;gt; source, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TSource, TKey&amp;gt; selector)
    &lt;span style="color:blue;"&gt;where &lt;/span&gt;TKey : &lt;span style="color:#2b91af;"&gt;IEquatable&lt;/span&gt;&amp;lt;TKey&amp;gt;
{
    &lt;span style="color:blue;"&gt;return &lt;/span&gt;source.Distinct(&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;SelectorEqualityComparer&lt;/span&gt;&amp;lt;TSource, TKey&amp;gt;(selector));
}&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;E agora uso apenas este código:&lt;/p&gt;

&lt;pre class="code"&gt;.Distinct(x =&amp;gt; x.Field)&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;p&gt;Para a maioria dos casos, é mais simples que usar um predicado.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/09/linq-melhorando-distinct-com-o-selectorequalitycomparer.aspx&amp;amp;;subject=LINQ%3a+Melhorando+Distinct+Com+O+SelectorEqualityComparer" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/09/linq-melhorando-distinct-com-o-selectorequalitycomparer.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/09/linq-melhorando-distinct-com-o-selectorequalitycomparer.aspx&amp;amp;;title=LINQ%3a+Melhorando+Distinct+Com+O+SelectorEqualityComparer" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/09/linq-melhorando-distinct-com-o-selectorequalitycomparer.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/09/linq-melhorando-distinct-com-o-selectorequalitycomparer.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/09/linq-melhorando-distinct-com-o-selectorequalitycomparer.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/09/linq-melhorando-distinct-com-o-selectorequalitycomparer.aspx&amp;amp;title=LINQ%3a+Melhorando+Distinct+Com+O+SelectorEqualityComparer" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/09/linq-melhorando-distinct-com-o-selectorequalitycomparer.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/09/linq-melhorando-distinct-com-o-selectorequalitycomparer.aspx&amp;amp;;title=LINQ%3a+Melhorando+Distinct+Com+O+SelectorEqualityComparer" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/09/linq-melhorando-distinct-com-o-selectorequalitycomparer.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/09/linq-melhorando-distinct-com-o-selectorequalitycomparer.aspx&amp;amp;;title=LINQ%3a+Melhorando+Distinct+Com+O+SelectorEqualityComparer&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/09/linq-melhorando-distinct-com-o-selectorequalitycomparer.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=58110" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET+/default.aspx">.NET </category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Desenvolvimento/default.aspx">Desenvolvimento</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET3.5/default.aspx">.NET3.5</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category></item><item><title>LINQ: Melhorando Distinct Com O PredicateEqualityComparer</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/08/linq-melhorando-distinct-com-o-predicateequalitycomparer.aspx</link><pubDate>Thu, 08 Apr 2010 01:41:00 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:58108</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>1</slash:comments><description>&lt;p&gt;&lt;a title="LINQ Com C#" 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 Com C#" align="right" src="http://www.fca.pt/ximages/722_547.gif" width="99" height="140" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Hoje estava a escrever um consulta &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt; e necessitava de seleccionar valores distintos baseado num determinado critério de comparação.&lt;/p&gt;  &lt;p align="justify"&gt;Felizmente, o método &lt;a title="Distinct Method" href="http://msdn.microsoft.com/library/system.linq.enumerable.distinct.aspx" target="_blank"&gt;Distinct&lt;/a&gt; do &lt;strong&gt;LINQ&lt;/strong&gt; permite fornecer um &lt;a title="IEqualityComparer Interface" href="http://msdn.microsoft.com/library/ms132151.aspx" target="_blank"&gt;comparador de igualdade&lt;/a&gt;, mas, infelizmente, muitas vezes implica escrever um comparador específico para a ocasião.&lt;/p&gt;  &lt;p align="justify"&gt;Porque ia necessitar de mais que um comparador para o conjunto de ferramentas que estava a construír, decidi desenvolver um comparador genérico que recebesse um predicado. Algo como isto:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;PredicateEqualityComparer&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color:#2b91af;"&gt;EqualityComparer&lt;/span&gt;&amp;lt;T&amp;gt;
{
    &lt;span style="color:blue;"&gt;private &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T, T, &lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt; predicate;

    &lt;span style="color:blue;"&gt;public &lt;/span&gt;PredicateEqualityComparer(&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;T, T, &lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt; predicate)
        : &lt;span style="color:blue;"&gt;base&lt;/span&gt;()
    {
        &lt;span style="color:blue;"&gt;this&lt;/span&gt;.predicate = predicate;
    }

    &lt;span style="color:blue;"&gt;public override bool &lt;/span&gt;Equals(T x, T y)
    {
        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(x != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
        {
            &lt;span style="color:blue;"&gt;return &lt;/span&gt;((y != &lt;span style="color:blue;"&gt;null&lt;/span&gt;) &amp;amp;&amp;amp; &lt;span style="color:blue;"&gt;this&lt;/span&gt;.predicate(x, y));
        }

        &lt;span style="color:blue;"&gt;if &lt;/span&gt;(y != &lt;span style="color:blue;"&gt;null&lt;/span&gt;)
        {
            &lt;span style="color:blue;"&gt;return false&lt;/span&gt;;
        }

        &lt;span style="color:blue;"&gt;return true&lt;/span&gt;;
    }

    &lt;span style="color:blue;"&gt;public override int &lt;/span&gt;GetHashCode(T obj)
    {
        &lt;span style="color:green;"&gt;// Retornar sempre o mesmo valor para forçar a chamada a IEqualityComparer&amp;lt;T&amp;gt;.Equals&lt;/span&gt;
        &lt;span style="color:blue;"&gt;return &lt;/span&gt;0;
    }
}&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p align="justify"&gt;Agora já posso escrever código como este:&lt;/p&gt;

&lt;pre class="code"&gt;.Distinct(&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;PredicateEqualityComparer&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Item&lt;/span&gt;&amp;gt;((x, y) =&amp;gt; x.Field == y.Field))&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p align="justify"&gt;Mas senti que estava a perder toda a expressividade e concisão &lt;strong&gt;LINQ&lt;/strong&gt; e não suportava &lt;a title="Anonymous Types (C# Programming Guide)" href="http://msdn.microsoft.com/library/bb397696.aspx" target="_blank"&gt;tipos anónimos&lt;/a&gt;. Por isso, escrevi outro método &lt;strong&gt;Distinct&lt;/strong&gt;:&lt;/p&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;public static &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TSource&amp;gt; Distinct&amp;lt;TSource&amp;gt;(&lt;span style="color:blue;"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TSource&amp;gt; source, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TSource, TSource, &lt;span style="color:blue;"&gt;bool&lt;/span&gt;&amp;gt; predicate)
{
    &lt;span style="color:blue;"&gt;return &lt;/span&gt;source.Distinct(&lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;PredicateEqualityComparer&lt;/span&gt;&amp;lt;TSource&amp;gt;(predicate));
}&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p align="justify"&gt;E agora uso apenas este código:&lt;/p&gt;

&lt;pre class="code"&gt;.Distinct((x, y) =&amp;gt; x.Field == y.Field)&lt;/pre&gt;

&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p align="justify"&gt;Tem muito melhor aspect, não tem? E suporta tipos anónimos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Actualização:&lt;/strong&gt; Por acidente, tinha publicado a versão errada do método &lt;a title="IEqualityComparer.Equals Method" href="http://msdn.microsoft.com/library/ms132154.aspx" target="_blank"&gt;IEqualityComparer&amp;lt;T&amp;gt;.Equals&lt;/a&gt;.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/08/linq-melhorando-distinct-com-o-predicateequalitycomparer.aspx&amp;amp;;subject=LINQ%3a+Melhorando+Distinct+Com+O+PredicateEqualityComparer" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/08/linq-melhorando-distinct-com-o-predicateequalitycomparer.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/08/linq-melhorando-distinct-com-o-predicateequalitycomparer.aspx&amp;amp;;title=LINQ%3a+Melhorando+Distinct+Com+O+PredicateEqualityComparer" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/08/linq-melhorando-distinct-com-o-predicateequalitycomparer.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/08/linq-melhorando-distinct-com-o-predicateequalitycomparer.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/08/linq-melhorando-distinct-com-o-predicateequalitycomparer.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/08/linq-melhorando-distinct-com-o-predicateequalitycomparer.aspx&amp;amp;title=LINQ%3a+Melhorando+Distinct+Com+O+PredicateEqualityComparer" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/08/linq-melhorando-distinct-com-o-predicateequalitycomparer.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/08/linq-melhorando-distinct-com-o-predicateequalitycomparer.aspx&amp;amp;;title=LINQ%3a+Melhorando+Distinct+Com+O+PredicateEqualityComparer" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/08/linq-melhorando-distinct-com-o-predicateequalitycomparer.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/08/linq-melhorando-distinct-com-o-predicateequalitycomparer.aspx&amp;amp;;title=LINQ%3a+Melhorando+Distinct+Com+O+PredicateEqualityComparer&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/08/linq-melhorando-distinct-com-o-predicateequalitycomparer.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=58108" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET+/default.aspx">.NET </category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Desenvolvimento/default.aspx">Desenvolvimento</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET3.5/default.aspx">.NET3.5</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category></item><item><title>Modelo CodeIt.Right De Cabe&amp;#231;alho De Ficheiro De C&amp;#243;digo Para Regras StyleCop</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/07/modelo-codeit-right-de-cabe-231-alho-de-ficheiro-de-c-243-digo-para-regras-stylecop.aspx</link><pubDate>Wed, 07 Apr 2010 00:55:16 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:58105</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><description>&lt;p align="justify"&gt;Gosto de usar tanto o &lt;a title="Microsoft StyleCop - Source Code Style and Consistency Tool" href="http://code.msdn.microsoft.com/sourceanalysis" target="_blank"&gt;StyleCop&lt;/a&gt; como o &lt;a title="CodeIt.Right" href="http://submain.com/products/codeit.right.aspx" target="_blank"&gt;CodeIt.Right&lt;/a&gt; para validar o meu código – o &lt;strong&gt;StyleCop&lt;/strong&gt; porque é gratuito e o &lt;strong&gt;CodeIt.Right&lt;/strong&gt; porque é bom.&lt;/p&gt;  &lt;p align="justify"&gt;Enquanto que o &lt;strong&gt;StyleCop&lt;/strong&gt; apenas providencia validação, o &lt;strong&gt;CodeIt.Righ&lt;/strong&gt; providencia validação e correcção de violações.&lt;/p&gt;  &lt;p align="justify"&gt;Infelizmente, o modelo fornecido pelo &lt;strong&gt;CodeIt.Right&lt;/strong&gt; para os cabeçalhos dos ficheiros de código não está confrome as regras do &lt;strong&gt;StyleCop&lt;/strong&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Felizmente, o &lt;strong&gt;CodeIt.Right&lt;/strong&gt; permite-nos definir o nosso próprio modelo. Este é o meu:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="background:yellow;color:black;"&gt;&amp;lt;#@&lt;/span&gt; &lt;span style="color:maroon;"&gt;template &lt;/span&gt;&lt;span style="color:red;"&gt;language&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;C#&amp;quot; &lt;/span&gt;&lt;span style="background:yellow;color:black;"&gt;#&amp;gt;&lt;/span&gt;
&lt;span style="color:green;"&gt;//-----------------------------------------------------------------------
// &amp;lt;copyright file=&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span style="background:yellow;"&gt;&amp;lt;#=&lt;/span&gt; System.IO.Path.GetFileName(Context.DestinationFile) &lt;span style="background:yellow;"&gt;#&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;quot;
//            project=&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span style="background:yellow;"&gt;&amp;lt;#=&lt;/span&gt; Context.ProjectName &lt;span style="background:yellow;"&gt;#&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;quot;
//            assembly=&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span style="background:yellow;"&gt;&amp;lt;#=&lt;/span&gt; Context.AssemblyName &lt;span style="background:yellow;"&gt;#&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;quot;
//            solution=&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span style="background:yellow;"&gt;&amp;lt;#=&lt;/span&gt; Context.SolutionName &lt;span style="background:yellow;"&gt;#&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;quot;
//            company=&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span style="background:yellow;"&gt;&amp;lt;#=&lt;/span&gt; Context.GetGlobalProperty(&lt;/span&gt;&lt;span style="color:maroon;"&gt;&amp;quot;CompanyName&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;) &lt;span style="background:yellow;"&gt;#&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;quot;&amp;gt;
//     Copyright (c) &lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span style="background:yellow;"&gt;&amp;lt;#=&lt;/span&gt; Context.GetGlobalProperty(&lt;/span&gt;&lt;span style="color:maroon;"&gt;&amp;quot;CompanyName&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;) &lt;span style="background:yellow;"&gt;#&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:green;"&gt;. All rights reserved.
// &amp;lt;/copyright&amp;gt;
// &amp;lt;author id=&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span style="background:yellow;"&gt;&amp;lt;#=&lt;/span&gt; Context.GetGlobalProperty(&lt;/span&gt;&lt;span style="color:maroon;"&gt;&amp;quot;UserID&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;) &lt;span style="background:yellow;"&gt;#&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color:black;"&gt;&lt;span style="background:yellow;"&gt;&amp;lt;#=&lt;/span&gt; Context.GetGlobalProperty(&lt;/span&gt;&lt;span style="color:maroon;"&gt;&amp;quot;UserName&amp;quot;&lt;/span&gt;&lt;span style="color:black;"&gt;) &lt;span style="background:yellow;"&gt;#&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:green;"&gt;&amp;lt;/author&amp;gt;
// &amp;lt;summary&amp;gt;&amp;lt;/summary&amp;gt;
//-----------------------------------------------------------------------

&lt;/span&gt;&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/07/modelo-codeit-right-de-cabe-231-alho-de-ficheiro-de-c-243-digo-para-regras-stylecop.aspx&amp;amp;;subject=Modelo+CodeIt.Right+De+Cabe%26amp%3b%23231%3balho+De+Ficheiro+De+C%26amp%3b%23243%3bdigo+Para+Regras+StyleCop" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/07/modelo-codeit-right-de-cabe-231-alho-de-ficheiro-de-c-243-digo-para-regras-stylecop.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/07/modelo-codeit-right-de-cabe-231-alho-de-ficheiro-de-c-243-digo-para-regras-stylecop.aspx&amp;amp;;title=Modelo+CodeIt.Right+De+Cabe%26amp%3b%23231%3balho+De+Ficheiro+De+C%26amp%3b%23243%3bdigo+Para+Regras+StyleCop" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/07/modelo-codeit-right-de-cabe-231-alho-de-ficheiro-de-c-243-digo-para-regras-stylecop.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/07/modelo-codeit-right-de-cabe-231-alho-de-ficheiro-de-c-243-digo-para-regras-stylecop.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/07/modelo-codeit-right-de-cabe-231-alho-de-ficheiro-de-c-243-digo-para-regras-stylecop.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/07/modelo-codeit-right-de-cabe-231-alho-de-ficheiro-de-c-243-digo-para-regras-stylecop.aspx&amp;amp;title=Modelo+CodeIt.Right+De+Cabe%26amp%3b%23231%3balho+De+Ficheiro+De+C%26amp%3b%23243%3bdigo+Para+Regras+StyleCop" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/07/modelo-codeit-right-de-cabe-231-alho-de-ficheiro-de-c-243-digo-para-regras-stylecop.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/07/modelo-codeit-right-de-cabe-231-alho-de-ficheiro-de-c-243-digo-para-regras-stylecop.aspx&amp;amp;;title=Modelo+CodeIt.Right+De+Cabe%26amp%3b%23231%3balho+De+Ficheiro+De+C%26amp%3b%23243%3bdigo+Para+Regras+StyleCop" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/07/modelo-codeit-right-de-cabe-231-alho-de-ficheiro-de-c-243-digo-para-regras-stylecop.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/07/modelo-codeit-right-de-cabe-231-alho-de-ficheiro-de-c-243-digo-para-regras-stylecop.aspx&amp;amp;;title=Modelo+CodeIt.Right+De+Cabe%26amp%3b%23231%3balho+De+Ficheiro+De+C%26amp%3b%23243%3bdigo+Para+Regras+StyleCop&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/07/modelo-codeit-right-de-cabe-231-alho-de-ficheiro-de-c-243-digo-para-regras-stylecop.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=58105" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Desenvolvimento/default.aspx">Desenvolvimento</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/CodingConventions/default.aspx">CodingConventions</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/CodeIt.Right/default.aspx">CodeIt.Right</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/StyleCop/default.aspx">StyleCop</category></item><item><title>Defini&amp;#231;&amp;#227;o Do Modo De Compatibilidade No Internet Explorer 8</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/defini-231-227-o-do-modo-de-compatibilidade-no-internet-explorer-8.aspx</link><pubDate>Mon, 05 Apr 2010 01:46:20 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:58100</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><description>&lt;p align="justify"&gt;O procedimento para definir o modo de compatibilidade do &lt;a title="Internet Explorer" href="http://www.microsoft.com/windows/internet-explorer/" target="_blank"&gt;&lt;strong&gt;Internet Explorer&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; 8&lt;/strong&gt; estão bem documentados &lt;a title="Defining Document Compatibility" href="http://msdn.microsoft.com/library/cc288325.aspx" target="_blank"&gt;aqui&lt;/a&gt;. No entanto, tenho me apercebido de que muitos programadores e administradores de sistemas desconhecem isto.&lt;/p&gt;  &lt;p align="justify"&gt;Apesar de se poder (e dever) definir o modo de compatibilidade para o qual as páginas foram desenvolvidas, se al não for eito, o &lt;strong&gt;Internet Explorer 8&lt;/strong&gt; e o &lt;a title="WebBrowserControl for the .NET Framework 1.1" href="http://www.codeproject.com/KB/miscctrl/WebBrowserControl11.aspx" target="_blank"&gt;Web Browser Control&lt;/a&gt; usarão os seguintes modos:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2"&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;p align="center"&gt;&lt;strong&gt;Aplicação&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p align="center"&gt;&lt;strong&gt;Intranet&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p align="center"&gt;&lt;strong&gt;Internet&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Internet Explorer 8&lt;/td&gt;        &lt;td&gt;modo IE7&lt;/td&gt;        &lt;td&gt;modo IE8&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;Aplicação hospedando o Web Browser Control&lt;/td&gt;        &lt;td&gt;modo IE7&lt;/td&gt;        &lt;td&gt;modo IE7&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p align="justify"&gt;Se notarem no quadro acima, por omissão (e não defeito), apenas o Internet Explore 8 se anuncia como Internet Explorer 8 e apenas para sítios da Internet.&lt;/p&gt;  &lt;p align="justify"&gt;O modo como o Internet Explorer (e qualquer outro navegador) se anuncia perante um servidor é usando a sua user-agent string:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2"&gt;     &lt;tr&gt;       &lt;td&gt;         &lt;p align="center"&gt;&lt;strong&gt;Modo&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td&gt;         &lt;p align="center"&gt;&lt;strong&gt;User Agent String&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;IE7&lt;/td&gt;        &lt;td&gt;Mozilla/4.0 (compatible; MSIE 7.0; …; Trident/4.0; …)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;IE8&lt;/td&gt;        &lt;td&gt;Mozilla/4.0 (compatible; MSIE 8.0; …; Trident/4.0; …)&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;(Se estão interessados em saber mais acerca da história da user-agent string, leiam a &lt;a title="History of the user-agent string" href="http://www.nczonline.net/blog/2010/01/12/history-of-the-user-agent-string/" target="_blank"&gt;História da user-agent string&lt;/a&gt;)&lt;/p&gt;  &lt;p align="justify"&gt;A &lt;a title="Microsoft Corporation" href="http://www.microsoft.com/" target="_blank"&gt;Microsoft&lt;/a&gt; fez isto para manter a compatibilidade com aplicações empresariais, mas pode trazer algumas complicações ao desenvolvimento.&lt;/p&gt;  &lt;p align="justify"&gt;Quem estiver a desenvolver uma aplicação web para o Internet Explorer 8 dirigida ao públic (Internet), pode ver o mesmo na sua máquina de desenvolvimento. Já a equipa de testes (normalmente testando na intranet) poderá ver as páginas como estando no Internet Explorer 7. Se a aplicação é para ser acedida a partir de uma aplicação que hospeda o Web Browser Control e quem desenvolve não testar nessa aplicação, então não está a er a mesma coisa.&lt;/p&gt;  &lt;p align="justify"&gt;Para saber como o navegador se está a anunciar ao servidor na Internet, há diversos sítios que mostrarão a informação de user-agent string (como o &lt;a title="useragents.org" href="http://www.useragents.org/" target="_blank"&gt;http://www.useragents.org/&lt;/a&gt;) e ajuda ter o mesmo na intranet. Quem pretender construír uma aplicação destas usando &lt;a title="ASP.NET Developer Center" href="http://msdn.microsoft.com/asp.net/" target="_blank"&gt;ASP.NET&lt;/a&gt;, pode usar a propriedade &lt;a title="HttpRequest.UserAgent Property" href="http://msdn.microsoft.com/library/system.web.httprequest.useragent.aspx" target="_blank"&gt;UserAgent&lt;/a&gt; da lasse &lt;a title="HttpRequest Class" href="http://msdn.microsoft.com/library/system.web.httprequest.aspx" target="_blank"&gt;HttpRequest&lt;/a&gt; (ou a propriedade &lt;a title="HttpRequest.Browser Property" href="http://msdn.microsoft.com/library/system.web.httprequest.browser.aspx" target="_blank"&gt;Browser&lt;/a&gt;, para informação mais detalhada).&lt;/p&gt;  &lt;p align="justify"&gt;Este tipo de informação também está disponível no Internet Explorer através do objecto &lt;a title="navigator Object" href="http://msdn.microsoft.com/library/ms535867.aspx" target="_blank"&gt;navigator&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;O &lt;a title="Giorgio Sardo Blog" href="http://blogs.msdn.com/giorgio/" target="_blank"&gt;Giorgio Sardo&lt;/a&gt; tem algumas &lt;a title="How to detect IE8 using JavaScript (Client side)" href="http://blogs.msdn.com/giorgio/archive/2009/04/14/how-to-detect-ie8-using-javascript-client-side.aspx" target="_blank"&gt;funções para detectar o Internet Explorer 8&lt;/a&gt; mas quem quiser desenvolver uma página (ou parte) de diagnóstioco para mostrar as característicasdo navegador, pode usar algo como isto:&lt;/p&gt;  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;fieldset &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowserInfo&amp;quot;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;legend&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;Web Browser&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;legend&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;table &lt;/span&gt;&lt;span style="color:red;"&gt;border&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;1&amp;quot;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;label&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;style&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:red;"&gt;width&lt;/span&gt;: &lt;span style="color:blue;"&gt;100px&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label &lt;/span&gt;&lt;span style="color:red;"&gt;for&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$userAgent&amp;quot;&amp;gt;&lt;/span&gt;userAgent&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;value&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;colspan&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;3&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$userAgent&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;label&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;style&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:red;"&gt;width&lt;/span&gt;: &lt;span style="color:blue;"&gt;100px&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label &lt;/span&gt;&lt;span style="color:red;"&gt;for&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$appVersion&amp;quot;&amp;gt;&lt;/span&gt;appVersion&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;value&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$appVersion&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;label&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label &lt;/span&gt;&lt;span style="color:red;"&gt;for&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$appMinorVersion&amp;quot;&amp;gt;&lt;/span&gt;appMinorVersion&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;value&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$appMinorVersion&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;label&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;style&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:red;"&gt;width&lt;/span&gt;: &lt;span style="color:blue;"&gt;100px&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label &lt;/span&gt;&lt;span style="color:red;"&gt;for&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$appCodeName&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;style&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:red;"&gt;width&lt;/span&gt;: &lt;span style="color:blue;"&gt;600px&amp;quot;&amp;gt;&lt;/span&gt;appCodeName&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;value&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;colspan&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;3&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$appCodeName&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;label&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label &lt;/span&gt;&lt;span style="color:red;"&gt;for&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$appName&amp;quot;&amp;gt;&lt;/span&gt;appName&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;value&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;colspan&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;3&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$appName&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;label&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;style&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:red;"&gt;width&lt;/span&gt;: &lt;span style="color:blue;"&gt;100px&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label &lt;/span&gt;&lt;span style="color:red;"&gt;for&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$userLanguage&amp;quot;&amp;gt;&lt;/span&gt;userLanguage&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;value&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$userLanguage&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;label&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;style&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:red;"&gt;width&lt;/span&gt;: &lt;span style="color:blue;"&gt;100px&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label &lt;/span&gt;&lt;span style="color:red;"&gt;for&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$cpuClass&amp;quot;&amp;gt;&lt;/span&gt;cpuClass&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;value&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$cpuClass&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;label&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label &lt;/span&gt;&lt;span style="color:red;"&gt;for&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$systemLanguage&amp;quot;&amp;gt;&lt;/span&gt;systemLanguage&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;value&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$systemLanguage&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;label&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label &lt;/span&gt;&lt;span style="color:red;"&gt;for&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$platform&amp;quot;&amp;gt;&lt;/span&gt;platform&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;value&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$platform&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;label&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label &lt;/span&gt;&lt;span style="color:red;"&gt;for&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$browserLanguage&amp;quot;&amp;gt;&lt;/span&gt;browserLanguage&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;value&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$browserLanguage&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;label&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;style&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;&lt;/span&gt;&lt;span style="color:red;"&gt;width&lt;/span&gt;: &lt;span style="color:blue;"&gt;100px&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label &lt;/span&gt;&lt;span style="color:red;"&gt;for&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$cookieEnabled&amp;quot;&amp;gt;&lt;/span&gt;cookieEnabled&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;label&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
            &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td &lt;/span&gt;&lt;span style="color:red;"&gt;class&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;value&amp;quot; &lt;/span&gt;&lt;span style="color:red;"&gt;colspan&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span &lt;/span&gt;&lt;span style="color:red;"&gt;id&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;webBrowser$cookieEnabled&amp;quot;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;span&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;td&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
        &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tr&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;table&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;fieldset&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;
&lt;/span&gt;
&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;script &lt;/span&gt;&lt;span style="color:red;"&gt;type&lt;/span&gt;&lt;span style="color:blue;"&gt;=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;span style="color:#000000;"&gt;
    document.getElementById(&lt;span style="color:#a31515;"&gt;&amp;quot;webBrowser$userAgent&amp;quot;&lt;/span&gt;).innerHTML = window.navigator.userAgent;
    document.getElementById(&lt;span style="color:#a31515;"&gt;&amp;quot;webBrowser$appCodeName&amp;quot;&lt;/span&gt;).innerHTML = window.navigator.appCodeName;
    document.getElementById(&lt;span style="color:#a31515;"&gt;&amp;quot;webBrowser$appMinorVersion&amp;quot;&lt;/span&gt;).innerHTML = window.navigator.appMinorVersion;
    document.getElementById(&lt;span style="color:#a31515;"&gt;&amp;quot;webBrowser$appName&amp;quot;&lt;/span&gt;).innerHTML = window.navigator.appName;
    document.getElementById(&lt;span style="color:#a31515;"&gt;&amp;quot;webBrowser$appVersion&amp;quot;&lt;/span&gt;).innerHTML = window.navigator.appVersion;
    document.getElementById(&lt;span style="color:#a31515;"&gt;&amp;quot;webBrowser$browserLanguage&amp;quot;&lt;/span&gt;).innerHTML = window.navigator.browserLanguage;
    document.getElementById(&lt;span style="color:#a31515;"&gt;&amp;quot;webBrowser$cookieEnabled&amp;quot;&lt;/span&gt;).innerHTML = window.navigator.cookieEnabled;
    document.getElementById(&lt;span style="color:#a31515;"&gt;&amp;quot;webBrowser$cpuClass&amp;quot;&lt;/span&gt;).innerHTML = window.navigator.cpuClass;
    document.getElementById(&lt;span style="color:#a31515;"&gt;&amp;quot;webBrowser$platform&amp;quot;&lt;/span&gt;).innerHTML = window.navigator.platform;
    document.getElementById(&lt;span style="color:#a31515;"&gt;&amp;quot;webBrowser$systemLanguage&amp;quot;&lt;/span&gt;).innerHTML = window.navigator.systemLanguage;
    document.getElementById(&lt;span style="color:#a31515;"&gt;&amp;quot;webBrowser$userLanguage&amp;quot;&lt;/span&gt;).innerHTML = window.navigator.userLanguage;&lt;/span&gt;
&amp;lt;/&lt;span style="color:#a31515;"&gt;script&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/defini-231-227-o-do-modo-de-compatibilidade-no-internet-explorer-8.aspx&amp;amp;;subject=Defini%26amp%3b%23231%3b%26amp%3b%23227%3bo+Do+Modo+De+Compatibilidade+No+Internet+Explorer+8" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/defini-231-227-o-do-modo-de-compatibilidade-no-internet-explorer-8.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/defini-231-227-o-do-modo-de-compatibilidade-no-internet-explorer-8.aspx&amp;amp;;title=Defini%26amp%3b%23231%3b%26amp%3b%23227%3bo+Do+Modo+De+Compatibilidade+No+Internet+Explorer+8" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/defini-231-227-o-do-modo-de-compatibilidade-no-internet-explorer-8.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/defini-231-227-o-do-modo-de-compatibilidade-no-internet-explorer-8.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/defini-231-227-o-do-modo-de-compatibilidade-no-internet-explorer-8.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/defini-231-227-o-do-modo-de-compatibilidade-no-internet-explorer-8.aspx&amp;amp;title=Defini%26amp%3b%23231%3b%26amp%3b%23227%3bo+Do+Modo+De+Compatibilidade+No+Internet+Explorer+8" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/defini-231-227-o-do-modo-de-compatibilidade-no-internet-explorer-8.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/defini-231-227-o-do-modo-de-compatibilidade-no-internet-explorer-8.aspx&amp;amp;;title=Defini%26amp%3b%23231%3b%26amp%3b%23227%3bo+Do+Modo+De+Compatibilidade+No+Internet+Explorer+8" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/defini-231-227-o-do-modo-de-compatibilidade-no-internet-explorer-8.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/defini-231-227-o-do-modo-de-compatibilidade-no-internet-explorer-8.aspx&amp;amp;;title=Defini%26amp%3b%23231%3b%26amp%3b%23227%3bo+Do+Modo+De+Compatibilidade+No+Internet+Explorer+8&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/defini-231-227-o-do-modo-de-compatibilidade-no-internet-explorer-8.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=58100" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Web/default.aspx">Web</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Desenvolvimento/default.aspx">Desenvolvimento</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/InternetExplorer/default.aspx">InternetExplorer</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/Internet/default.aspx">Internet</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/WebBrowserControl/default.aspx">WebBrowserControl</category></item><item><title>Windows Home Server E O Problema "Unknown network error has occurred during PC Restore"</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/windows-home-server-e-o-problema-quot-unknown-network-error-has-occurred-during-pc-restore-quot.aspx</link><pubDate>Sun, 04 Apr 2010 23:02:00 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:58099</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><description>&lt;P align=justify&gt;Esta semana tive de restaurar o PC do meu filho devido à instalação de um jogo que deixou o PC num estado em que o &lt;A title="Microsoft Windows 7" href="http://www.microsoft.com/windows/windows-7/" target=_blank&gt;Windows 7&lt;/A&gt; não conseguia arrancar ou recuperar.&lt;/P&gt;
&lt;P align=justify&gt;Felizmente, temos um &lt;A title="Microsoft Windows Home Server" href="http://www.microsoft.com/windows/products/winfamily/windowshomeserver/" target=_blank&gt;Windows Home Server&lt;/A&gt;, por isso não me preocupei. Bastava restaurar o PC usando a última cópia de segurança – feita automaticamente no dia anterior.&lt;/P&gt;
&lt;P align=justify&gt;Bem, não foi assim tão fácil.&lt;/P&gt;
&lt;P align=justify&gt;O &lt;STRONG&gt;Windows Home Server&lt;/STRONG&gt; armazena os gestores de dispositivos (&lt;EM&gt;device drivers&lt;/EM&gt;) junto com a cópia de segurança, mas o programa de restauro é um program de 32 bita e este PC tinha uma versão de 64 bits do &lt;STRONG&gt;Windows 7&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P align=justify&gt;Depois de adicionar os gestores de 32 bits para a placa de rede sem fios, tentei restaurar o PC, mas o programa não conseguia encontrar o servidor usando a placa de rede sem fios e não detectava a placa de rede com fios.&lt;/P&gt;
&lt;P align=justify&gt;Depois de adicionar gestores de 32 bits para a rede com fios incluída na placa-mãe (e arranjar um cabo bem longo), tentei outra vez. O programa de restauro já conseguia encontrar o servidor e era possível iniciar o restauro.&lt;/P&gt;
&lt;P align=justify&gt;O problema agora era que, ao fim de algum tempo, o restauro treminava com o erro &lt;STRONG&gt;Unknown network error has occurred during PC Restore&lt;/STRONG&gt; (Ocorreu um erro de rede desconhecido durante o restauro do PC).&lt;/P&gt;
&lt;P align=justify&gt;Após algumas tentativas, percebi que o erro&amp;nbsp; ocorria por volta da altura em que o IP concedido pelo roteador (&lt;EM&gt;router&lt;/EM&gt;) expirava – 1 hora. Depois de extender o tempo de concessão de IPs, foi possível completar o restauro.&lt;/P&gt;
&lt;P align=justify&gt;Continuo a achar o &lt;STRONG&gt;Windows Home Server&lt;/STRONG&gt; fantástico, mas seria melhor se:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;OS PCs clientes pudessem arrancar pela rede usando o servidor. &lt;BR&gt;Não sei se isto era possível, mas que era bom, era.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;O programa de restauro deveria existir em versões de 32 e 64 bits para poderem ser usados os gestores de dispositivos dos PCs clientes. &lt;BR&gt;Ou, em alternativa, pedir pelos gestores de 32 bits quando o conector é instalado no PC cliente.&lt;/DIV&gt;&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV align=justify&gt;Melhorar o suporte de rede. &lt;BR&gt;Ainda não sei o que aconteceu, porque acabei por conseguir restaurar o PC e não sou um especialista em redes.&lt;/DIV&gt;&lt;/LI&gt;&lt;/UL&gt;
&lt;P align=justify&gt;&lt;A title="How to restore a client PC, if the network connection does not work in the CD based restore environment" href="http://social.microsoft.com/Forums/en-US/whsfaq/thread/e3cd8791-5456-479b-943e-6399092363a7" target=_blank&gt;aqui&lt;/A&gt; podem ser encontradas instrucções sobre o que fazer quando a rede não funciona no ambiente do CD de restauro. No entanto, este conjunto de instrucções elaborado pelo &lt;A title="Olaf Engelke" href="http://social.microsoft.com/Profile/en-US/?user=Olaf%20Engelke" target=_blank&gt;Olaf&lt;/A&gt; não menciona o problema do IP expirado.&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/windows-home-server-e-o-problema-quot-unknown-network-error-has-occurred-during-pc-restore-quot.aspx&amp;amp;;subject=Windows+Home+Server+E+O+Problema+%26quot%3bUnknown+network+error+has+occurred+during+PC+Restore%26quot%3b" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/windows-home-server-e-o-problema-quot-unknown-network-error-has-occurred-during-pc-restore-quot.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/windows-home-server-e-o-problema-quot-unknown-network-error-has-occurred-during-pc-restore-quot.aspx&amp;amp;;title=Windows+Home+Server+E+O+Problema+%26quot%3bUnknown+network+error+has+occurred+during+PC+Restore%26quot%3b" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/windows-home-server-e-o-problema-quot-unknown-network-error-has-occurred-during-pc-restore-quot.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/windows-home-server-e-o-problema-quot-unknown-network-error-has-occurred-during-pc-restore-quot.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/windows-home-server-e-o-problema-quot-unknown-network-error-has-occurred-during-pc-restore-quot.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/windows-home-server-e-o-problema-quot-unknown-network-error-has-occurred-during-pc-restore-quot.aspx&amp;amp;title=Windows+Home+Server+E+O+Problema+%26quot%3bUnknown+network+error+has+occurred+during+PC+Restore%26quot%3b" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/windows-home-server-e-o-problema-quot-unknown-network-error-has-occurred-during-pc-restore-quot.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/windows-home-server-e-o-problema-quot-unknown-network-error-has-occurred-during-pc-restore-quot.aspx&amp;amp;;title=Windows+Home+Server+E+O+Problema+%26quot%3bUnknown+network+error+has+occurred+during+PC+Restore%26quot%3b" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/windows-home-server-e-o-problema-quot-unknown-network-error-has-occurred-during-pc-restore-quot.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/windows-home-server-e-o-problema-quot-unknown-network-error-has-occurred-during-pc-restore-quot.aspx&amp;amp;;title=Windows+Home+Server+E+O+Problema+%26quot%3bUnknown+network+error+has+occurred+during+PC+Restore%26quot%3b&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/04/05/windows-home-server-e-o-problema-quot-unknown-network-error-has-occurred-during-pc-restore-quot.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=58099" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/WindowsHomeServer/default.aspx">WindowsHomeServer</category></item><item><title>LINQ: Single vs. SingleOrDefault</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/30/linq-single-vs-singleordefault.aspx</link><pubDate>Tue, 30 Mar 2010 01:35:06 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:57970</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>0</slash:comments><description>&lt;p&gt;Tal como outros métodos da API do &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt; que extraem valores escalares de sequências, o &lt;a title="Método Enumerable.Single" href="http://msdn.microsoft.com/library/system.linq.enumerable.single.aspx" target="_blank"&gt;Single&lt;/a&gt; tem um correspondente &lt;a title="Método Enumerable.SingleOrDefault" href="http://msdn.microsoft.com/library/system.linq.enumerable.singleordefault.aspx" target="_blank"&gt;SingleOrDefault&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;A documentação de &lt;strong&gt;SingleOrDefault&lt;/strong&gt; diz que &lt;strong&gt;&lt;strong&gt;retorna um único e específico elemento de um sequência de valores&lt;/strong&gt;, ou um valor por omissão se tal elemento não exisitir&lt;/strong&gt;, although, in my opinion, it should state that it &lt;strong&gt;&lt;strong&gt;retorna O único e específico elemento de um sequência de UM valor&lt;/strong&gt;, ou um valor por omissão se tal elemento não exisitir&lt;/strong&gt;. Não obstante, o que este método faz é retornar o valor por omissão para o tipo da fonte e a sequÊncia for vazia ou, tal como &lt;strong&gt;Single&lt;/strong&gt;, lançar uma excepção se a sequência tiver mais de um elemento.&lt;/p&gt;  &lt;p&gt;Recebi alguns comentários à minha última &lt;a title="LINQ: Single vs. First" href="http://paulomorgado.net/pt/blog/archive/2010/03/29/linq-single-vs-first.aspx" target="_blank"&gt;entrada&lt;/a&gt; dizendo que poderia ser usado o método &lt;strong&gt;SingleOrDefault&lt;/strong&gt; para evitar a excepção.&lt;/p&gt;  &lt;p&gt;Bem, apenas “resolve” metade do “problema”. Se a sequência tiver mais de um elemento, uma excepção será lançada, de qualquer modo.&lt;/p&gt;  &lt;p&gt;No final, tudo se resume a semântica e intenção. Se o esperado é que a sequência possa ter um ou nenhum element, então deve ser usado o método &lt;strong&gt;SingleOrDefault&lt;/strong&gt;. Se não é esperado que a sequência possa ser vazia mas é, então trata-se de uma situação excepcional e uma excepção deveria ser lançada de imediato. Neste caso, porque não usar o método &lt;strong&gt;Single&lt;/strong&gt;? Na minha opinião, quando ocorre uma falha deste tipo, é melhor falhar cedo e rápidamente do que tarde e lentamente.&lt;/p&gt;  &lt;p&gt;Otros métodos da API &lt;strong&gt;LINQ&lt;/strong&gt; que seguem o mesmo padrão são: &lt;a title="Método Enumerable.ElementAt" href="http://msdn.microsoft.com/library/system.linq.enumerable.elementat.aspx" target="_blank"&gt;ElementAt&lt;/a&gt;/&lt;a title="Método Enumerable.ElementAtOrDefault" href="http://msdn.microsoft.com/library/system.linq.enumerable.elementatordefault.aspx" target="_blank"&gt;ElementAtOrDefault&lt;/a&gt;, &lt;a title="Método Enumerable.First" href="http://msdn.microsoft.com/library/system.linq.enumerable.first.aspx" target="_blank"&gt;First&lt;/a&gt;/&lt;a title="Método Enumerable.FirstOrDefault" href="http://msdn.microsoft.com/library/system.linq.enumerable.firstordefault.aspx" target="_blank"&gt;FirstOrDefault&lt;/a&gt; and &lt;a title="Método Enumerable.Last" href="http://msdn.microsoft.com/library/system.linq.enumerable.last.aspx" target="_blank"&gt;Last&lt;/a&gt;/&lt;a title="Método Enumerable.LastOrDefault" href="http://msdn.microsoft.com/library/system.linq.enumerable.lastordefault.aspx" target="_blank"&gt;LastOrDefault&lt;/a&gt;.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/30/linq-single-vs-singleordefault.aspx&amp;amp;;subject=LINQ%3a+Single+vs.+SingleOrDefault" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/30/linq-single-vs-singleordefault.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/30/linq-single-vs-singleordefault.aspx&amp;amp;;title=LINQ%3a+Single+vs.+SingleOrDefault" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/30/linq-single-vs-singleordefault.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/30/linq-single-vs-singleordefault.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/30/linq-single-vs-singleordefault.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/30/linq-single-vs-singleordefault.aspx&amp;amp;title=LINQ%3a+Single+vs.+SingleOrDefault" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/30/linq-single-vs-singleordefault.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/30/linq-single-vs-singleordefault.aspx&amp;amp;;title=LINQ%3a+Single+vs.+SingleOrDefault" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/30/linq-single-vs-singleordefault.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/30/linq-single-vs-singleordefault.aspx&amp;amp;;title=LINQ%3a+Single+vs.+SingleOrDefault&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/30/linq-single-vs-singleordefault.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=57970" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET+/default.aspx">.NET </category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET3.5/default.aspx">.NET3.5</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category></item><item><title>LINQ: Single vs. First</title><link>http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/29/linq-single-vs-first.aspx</link><pubDate>Sun, 28 Mar 2010 23:23:18 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:57948</guid><dc:creator>Paulo Morgado</dc:creator><slash:comments>1</slash:comments><description>&lt;p align="justify"&gt;Já presenciei e estive envolvido em algumas discussões acerca da correcção e utilidade do método &lt;a title="Enumerable.Single Method" href="http://msdn.microsoft.com/library/system.linq.enumerable.single.aspx" target="_blank"&gt;Single&lt;/a&gt; na API do &lt;a title="Language-Integrated Query (LINQ)" href="http://msdn.microsoft.com/library/bb397926.aspx" target="_blank"&gt;LINQ&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;O argumento mais comum é que se está a pedir o primeiro elemento de um conjunto e que será lançada uma excepção se existir mais que um elemento nesse conjunto. Em vez disso, deveria ser usado o método &lt;a title="Enumerable.First Method" href="http://msdn.microsoft.com/library/system.linq.enumerable.first.aspx" target="_blank"&gt;First&lt;/a&gt;.&lt;/p&gt;  &lt;p align="justify"&gt;Apesar da documentação do método &lt;strong&gt;Single&lt;/strong&gt; dizer que &lt;strong&gt;retorna um único e específico elemento de um sequência de valores&lt;/strong&gt;, quando, na verdade, &lt;strong&gt;retorna O único e específico elemento de um sequência de UM valor&lt;/strong&gt;. Quando se usa o método &lt;strong&gt;Single&lt;/strong&gt; está-se a afirmar que a consulta resultará num valor escalar em vez de um conjunto de dimensão arbitrária.&lt;/p&gt;  &lt;p align="justify"&gt;Por outro lado, a documentação do método &lt;strong&gt;First&lt;/strong&gt; diz ue &lt;strong&gt;retorna o primeiro elemento de um sequência&lt;/strong&gt; de dimensão arbitrária.&lt;/p&gt;  &lt;p align="justify"&gt;Imagine que quer apanhar um taxi. Vai a uma fila de taxis e apanha o primeiro (FIRST) da fila, independentemente de quantos lá estiverem.&lt;/p&gt;  &lt;p align="justify"&gt;Por outro lado, se vai a um parque de estacionamento buscar o seu carro, quer o seu específico (SINGLE) carro. Se a sua “consulta” retornar mais de um carro, é uma excepção. Seja porque não reotrnou apenas o seu carro ou porque, por acaso, tinha mais de um carro seu no parque. É qualquer dos casos, é necessário refinar a consulta porque não vai ser possível conduzir mais que um ao mesmo tempo.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/29/linq-single-vs-first.aspx&amp;amp;;subject=LINQ%3a+Single+vs.+First" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/29/linq-single-vs-first.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/29/linq-single-vs-first.aspx&amp;amp;;title=LINQ%3a+Single+vs.+First" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/29/linq-single-vs-first.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/29/linq-single-vs-first.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/29/linq-single-vs-first.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/29/linq-single-vs-first.aspx&amp;amp;title=LINQ%3a+Single+vs.+First" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/29/linq-single-vs-first.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/29/linq-single-vs-first.aspx&amp;amp;;title=LINQ%3a+Single+vs.+First" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/29/linq-single-vs-first.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/29/linq-single-vs-first.aspx&amp;amp;;title=LINQ%3a+Single+vs.+First&amp;amp;;top=1" target="_blank" title = "Post http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/2010/03/29/linq-single-vs-first.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.arquitecturadesoftware.org/aggbug.aspx?PostID=57948" width="1" height="1"&gt;</description><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET+/default.aspx">.NET </category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET3.5/default.aspx">.NET3.5</category><category domain="http://www.arquitecturadesoftware.org/blogs/paulomorgado/archive/tags/.NET4.0/default.aspx">.NET4.0</category></item></channel></rss>