<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Marcio Althmann &#187; .NET Framework</title>
	<atom:link href="http://www.marcioalthmann.net/tag/net-framework/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.marcioalthmann.net</link>
	<description></description>
	<lastBuildDate>Tue, 24 Jan 2012 15:12:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Descobrindo se o SO ou Processo em execução é 64 bits</title>
		<link>http://www.marcioalthmann.net/2012/01/descobrindo-se-o-so-ou-processo-em-execucao-e-64-bits/</link>
		<comments>http://www.marcioalthmann.net/2012/01/descobrindo-se-o-so-ou-processo-em-execucao-e-64-bits/#comments</comments>
		<pubDate>Tue, 24 Jan 2012 15:12:48 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[64bits]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/?p=889</guid>
		<description><![CDATA[E ai pessoal, beleza? Mais uma dica simples, utilizando um recurso adicionado no .NET 4.0, para saber se o Sistema Operacional é 64 bits, ou o processo que está executando nossa lógica é 64 bits temos jeitos simples para fazer isso. Para descobrir se o sistema operacional é 64 bits é só fazer: Environment.Is64BitOperatingSystem E...<p><a href="http://www.marcioalthmann.net/2012/01/descobrindo-se-o-so-ou-processo-em-execucao-e-64-bits/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>E ai pessoal, beleza?</p>
<p>Mais uma dica simples, utilizando um recurso adicionado no .NET 4.0, para saber se o Sistema Operacional é 64 bits, ou o processo que está executando nossa lógica é 64 bits temos jeitos simples para fazer isso.</p>
<p>Para descobrir se o sistema operacional é 64 bits é só fazer:</p>
<pre class="brush: csharp">
Environment.Is64BitOperatingSystem
</pre>
<p>E para saber se o processo é 64 bits:</p>
<pre class="brush: csharp">
Environment.Is64BitProcess
</pre>
<p>Ambas as propriedades retornam um booleano.</p>
<p>Por enquanto é isso.</p>
<p>Abraços.</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2012/01/descobrindo-se-o-so-ou-processo-em-execucao-e-64-bits/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2012/01/descobrindo-se-o-so-ou-processo-em-execucao-e-64-bits/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utilizando o atributo ObsoleteAttribute</title>
		<link>http://www.marcioalthmann.net/2012/01/utilizando-o-atributo-obsoleteattribute/</link>
		<comments>http://www.marcioalthmann.net/2012/01/utilizando-o-atributo-obsoleteattribute/#comments</comments>
		<pubDate>Thu, 19 Jan 2012 00:37:27 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[obsolete]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/?p=881</guid>
		<description><![CDATA[As vezes quando utilizamos alguns objetos ou métodos do .Net, o Intellisense mostra o método riscado, e nos avisa que o mesmo está obsoleto, e devemos utilizar outra classe ou método no lugar, e podemos utilizar esse recurso nos nossos códigos! Trabalho criando ferramentas e frameworks pra outros desenvolvedores, e nem sempre quando disponibilizamos alguma...<p><a href="http://www.marcioalthmann.net/2012/01/utilizando-o-atributo-obsoleteattribute/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>As vezes quando utilizamos alguns objetos ou métodos do .Net, o Intellisense mostra o método riscado, e nos avisa que o mesmo está obsoleto, e devemos utilizar outra classe ou método no lugar, e podemos utilizar esse recurso nos nossos códigos!</p>
<p>Trabalho criando ferramentas e frameworks pra outros desenvolvedores, e nem sempre quando disponibilizamos alguma API para utilização, podemos sair removendo métodos por exemplo, não sabemos quem utilizou, e se em alguma possível atualização o software vai parar de funcionar ou não, e o atributo Obsolete pode nos ajudar nesse cenário, informando o que está obsoleto na API e será descartado em breve, ou simplesmente recomendando uma alternativa melhor!</p>
<p>A utilização do atributo é simples, vou pegar o código do <a href="https://github.com/marcioalthmann/BasicIoC" target="_blank">BasicIoC </a>e criar um método obsoleto de propósito, só preciso informar a mensagem que será mostrada para quem for utilizar o método.</p>
<pre class="brush: csharp">
[Obsolete(&quot;This method is obsolete; use method Register instead.&quot;)]
public Container Map&lt;T&gt;()
{
    _baseType = typeof (T);
    return this;
}
</pre>
<p>E o interessante é que o Intellisense já ajuda o desenvolvedor mostrando que o método é obsoleto.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2012/01/obsolete01.jpg" rel="lightbox[881]" title="obsolete01"><img class="aligncenter size-medium wp-image-882" title="obsolete01" src="http://www.marcioalthmann.net/wp-content/uploads/2012/01/obsolete01-300x92.jpg" alt="" width="300" height="92" /></a></p>
<p>Isso não impede a utilização do método, mas mostra avisos quando compilamos que utilizamos um método obsoleto.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2012/01/obsolete02.jpg" rel="lightbox[881]" title="obsolete02"><img class="aligncenter size-medium wp-image-883" title="obsolete02" src="http://www.marcioalthmann.net/wp-content/uploads/2012/01/obsolete02-300x51.jpg" alt="" width="300" height="51" /></a></p>
<p>Mas podemos adicionar um segundo parâmetra booleano quando configuramos o atributo, forçando um erro de compilação caso existe algum código utilizando um método ou classe obsoleta.</p>
<pre class="brush: csharp">
[Obsolete(&quot;This method is obsolete; use method Register instead.&quot;, true)]
public Container Map&lt;T&gt;()
{
    _baseType = typeof (T);
    return this;
}
</pre>
<p>Agora o código não compila mais, no lugar de um aviso um erro de compilação é mostrado, mostrando que estamos utilizando um método obsoleto.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2012/01/obsolete03.jpg" rel="lightbox[881]" title="obsolete03"><img class="aligncenter size-medium wp-image-884" title="obsolete03" src="http://www.marcioalthmann.net/wp-content/uploads/2012/01/obsolete03-300x50.jpg" alt="" width="300" height="50" /></a></p>
<p>Por hoje é isso.</p>
<p>Até o próximo post.</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2012/01/utilizando-o-atributo-obsoleteattribute/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2012/01/utilizando-o-atributo-obsoleteattribute/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pare de sofrer com as mensagens de erro em pt-br do Framework</title>
		<link>http://www.marcioalthmann.net/2011/12/pare-de-sofrer-com-as-mensagens-de-erro-em-pt-br-do-framework/</link>
		<comments>http://www.marcioalthmann.net/2011/12/pare-de-sofrer-com-as-mensagens-de-erro-em-pt-br-do-framework/#comments</comments>
		<pubDate>Thu, 29 Dec 2011 00:06:30 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[mensagens de erro]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/?p=835</guid>
		<description><![CDATA[Essa dica meu amigo de trabalho Carlos Neto quem passou por e-mail hoje,  e quero compartilhar. Não sei se já perceberam que a tradução das mensagens do .NET Framework para pt-br não é muito confiável, para não falar horrível :), geralmente não querem dizer muita coisa, e hoje fiquei sabendo do site Unlocalize. A idéia...<p><a href="http://www.marcioalthmann.net/2011/12/pare-de-sofrer-com-as-mensagens-de-erro-em-pt-br-do-framework/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>Essa dica meu amigo de trabalho Carlos Neto quem passou por e-mail hoje,  e quero compartilhar.</p>
<p>Não sei se já perceberam que a tradução das mensagens do .NET Framework para pt-br não é muito confiável, para não falar horrível :), geralmente não querem dizer muita coisa, e hoje fiquei sabendo do site <a href="http://www.unlocalize.com" target="_blank">Unlocalize</a>.</p>
<p>A idéia do site é simples, pegue uma mensagem de erro do .NET em qualquer idioma, e ele mostra essa mensagem em outros idiomas, então segue abaixo a imagem do texto do erro em pt-br e o texto em en-us marcado, site favoritado já :D.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/12/Unlocalize.jpg" rel="lightbox[835]" title="Unlocalize"><img class="aligncenter size-medium wp-image-836" title="Unlocalize" src="http://www.marcioalthmann.net/wp-content/uploads/2011/12/Unlocalize-300x168.jpg" alt="" width="300" height="168" /></a></p>
<p>Abraços e até o próximo post.</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2011/12/pare-de-sofrer-com-as-mensagens-de-erro-em-pt-br-do-framework/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2011/12/pare-de-sofrer-com-as-mensagens-de-erro-em-pt-br-do-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mostrando item selecionado no ListView</title>
		<link>http://www.marcioalthmann.net/2011/03/mostrando-item-selecionado-no-listview/</link>
		<comments>http://www.marcioalthmann.net/2011/03/mostrando-item-selecionado-no-listview/#comments</comments>
		<pubDate>Sat, 12 Mar 2011 00:12:07 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Windows Forms]]></category>
		<category><![CDATA[windows forms]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/2011/03/mostrando-item-selecionado-no-listview/</guid>
		<description><![CDATA[Olá, tudo bem? Nem lembro quando foi a última vez que escrevi sobre Windows Forms, a maioria dos desenvolvedores de aplicações para Windows ainda estão com projetos em Windows Forms, então hoje vou mostrar uma dica simples e útil. Quando trabalhamos com Windows Forms, é comum a utilização do controle ListView, principalmente pelas várias forms...<p><a href="http://www.marcioalthmann.net/2011/03/mostrando-item-selecionado-no-listview/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>Olá, tudo bem?</p>
<p>Nem lembro quando foi a última vez que escrevi sobre Windows Forms, a maioria dos desenvolvedores de aplicações para Windows ainda estão com projetos em Windows Forms, então hoje vou mostrar uma dica simples e útil.</p>
<p>Quando trabalhamos com Windows Forms, é comum a utilização do controle ListView, principalmente pelas várias forms de visualização dos dados, em lista, colunas, entre outras formas.</p>
<p>Quando possuimos um ListView com muitos itens, o controle ganha uma barra de rolagem, até ai tudo bem, agora imagine um ListView que possua 20 itens, mas apenas 12 itens estão visíveis sem o usuário precisar rolar a barra de rolagem.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/03/ListView01.png" rel="lightbox[415]" title="ListView01"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="ListView01" border="0" alt="ListView01" src="http://www.marcioalthmann.net/wp-content/uploads/2011/03/ListView01_thumb.png" width="227" height="240" /></a></p>
<p>Só que por algum motivo, o sistema irá selecionar sozinho um dos itens do ListView, por exemplo o último item, abaixo o código para carregar os itens e o código para selecionar o último item do ListView.</p>
<pre class="brush: csharp;">private void Form1_Load(object sender, EventArgs e)
{
    CarregarItens();
}

private void CarregarItens()
{
    for (int i = 1; i &lt;= 20; i++)
    {
        Lista.Items.Add(string.Format(&quot;Item {0}&quot;, i));
    }
}

private void SelecionarUltimoItem_Click(object sender, EventArgs e)
{
    var ultimoItemDaLista = Lista.Items[Lista.Items.Count - 1];
    ultimoItemDaLista.Selected = true;
    Lista.Select();
}</pre>
<p>O item será selecionado corretamente, mas o usuário vai precisar rolar manualmente a barra de rolagem para ver o item selecionado, o que não é o ideal, o usuário precisa descobrir sozinho que existe algo selecionado, ao invés do sistema ajudá-lo já mostrando que algo foi selecionado.</p>
<p>Para resolver esse problema utilizamos o método EnsureVisible() que está disponível na classe ListViewItem, dessa forma, o item ficará visível após selecionado, caso precise rolar a barra de rolagem isso será feito automaticamente. Só precisamos adicionar uma linha no código.</p>
<pre class="brush: csharp;">private void SelecionarUltimoItem_Click(object sender, EventArgs e)
{
    var ultimoItemDaLista = Lista.Items[Lista.Items.Count - 1];
    ultimoItemDaLista.Selected = true;
    ultimoItemDaLista.EnsureVisible();
    Lista.Select();
}</pre>
<p>Uma dica simples mas extremamente útil, independente do sistema o mesmo deve ajudar o usuário, e não esperar que o usuário adivinhe o que está acontecendo.</p>
<p>A partir de hoje, todos os códigos mostrados nos artigos estarão nog <a href="http://www.github.com" target="_blank">GitHub</a>, criei um repositório de Artigos lá, então quem estiver interessado no código fonte do projeto é só clicar no link abaixo.</p>
<p><a href="https://github.com/marcioalthmann/Artigos/tree/master/ListViewMostrarItemSelecionado" target="_blank">Código fonte do projeto.</a></p>
<p>Abraços.</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2011/03/mostrando-item-selecionado-no-listview/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2011/03/mostrando-item-selecionado-no-listview/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Entendendo Strings</title>
		<link>http://www.marcioalthmann.net/2011/02/entendendo-strings/</link>
		<comments>http://www.marcioalthmann.net/2011/02/entendendo-strings/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 00:02:44 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/2011/02/entendendo-strings/</guid>
		<description><![CDATA[Ano passado escrevi dois artigos comparando as formas de concatenar strings com .NET, pode ver os artigos aqui e aqui, mas agora vamos entender como as strings se comportam, e porque o .NET trata strings de uma forma “especial”. Antes de continuar falando das Strings, vamos entender os tipos de dados no .NET, basicamente temos...<p><a href="http://www.marcioalthmann.net/2011/02/entendendo-strings/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>Ano passado escrevi dois artigos comparando as formas de concatenar strings com .NET, pode ver os artigos <a href="http://www.marcioalthmann.net/2010/09/concatenao-de-strings/">aqui</a> e <a href="http://www.marcioalthmann.net/2010/09/concatenao-de-stringsstring-concat/">aqui</a>, mas agora vamos entender como as strings se comportam, e porque o .NET trata strings de uma forma “especial”.</p>
<p>Antes de continuar falando das Strings, vamos entender os tipos de dados no .NET, basicamente temos dois tipos que são classificados como <strong><em>Value Types </em></strong>e <strong><em>Reference Types. </em></strong>Vamos começar com os <em>Value Types</em> ou tipos de valor.</p>
<h4>Value Types</h4>
<p>O .NET Framework disponibiliza mais de 300 Value Types, são considerados Value Types tipos primitivos, que são os numéricos e booleanos, abaixo uma lista para ver alguns Value Types.</p>
<ul>
<li>bool</li>
<li>byte</li>
<li>char</li>
<li>decimal</li>
<li>double</li>
<li>enum</li>
<li>float</li>
<li>int</li>
<li>long</li>
</ul>
<p>Existem mais, mas com a lista acima já da para ter uma idéia de quem são os Value Types. Mais um detalhe é que os Value Types herdam de <em>System.ValueType.</em></p>
<p>Agora o mais importante é entender como os <em>Value Types</em> são armazenados na memória e como acessamos o valor armazenado.</p>
<p>Segundo a documentação na <a href="http://msdn.microsoft.com/en-us/library/system.valuetype.aspx" target="_blank">MSDN</a>, os <em>Value Types</em> são armazenados em uma área da memória chamada <strong><em>Stack</em></strong> e os <em>Reference Types</em> em uma área chamada <strong><em>Heap</em></strong>, para não complicar o artigo aqui, quem quiser entender melhor essa parte recomendo o artigo do <a href="http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx" target="_blank">Eric Lippert.</a></p>
<p>Então uma variável do tipo <em>Value Types</em> acessa diretamente o valor armazenado no <strong><em>Heap.</em></strong></p>
<pre class="brush: csharp;">static void Main(string[] args)
{
    int minhaIdade;
    int idadeDaMinhaNamorada = 27; 

    minhaIdade = idadeDaMinhaNamorada;
    idadeDaMinhaNamorada = 26; 

    Console.WriteLine("Minha Idade: {0}", minhaIdade);
    Console.WriteLine("Idade da minha namorada: {0}", idadeDaMinhaNamorada);
}</pre>
<p>O resultado desse código é que eu possuo 27 anos, e minha namorada 26, quando eu falei <em>minhaIdade = idadeDaMinhaNamorada; </em>a variável <em>minhaIdade</em> recebe uma cópia do valor que está na variável <em>idadeDaMinhaNamorada</em>, por isso consigo alterar o valor da variável <em>idadeDaMinhaNamorada</em> sem afetar no valor recebido anteriormente pela variável <em>minhaIdade. </em></p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/02/Resultado01.png" rel="lightbox[401]" title="Resultado01"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="Resultado01" src="http://www.marcioalthmann.net/wp-content/uploads/2011/02/Resultado01_thumb.png" border="0" alt="Resultado01" width="240" height="139" /></a></p>
<h4>Reference Types</h4>
<p>Os <em><a href="http://msdn.microsoft.com/en-us/library/490f96s2.aspx" target="_blank">Reference Types</a></em> armazenam os valores em uma área da memória chamada <strong><em>Heap</em></strong>, e na <strong><em>Stack</em></strong> existe uma referência de onde o valor daquela variável está armazenada dentro do <strong><em>Heap.</em></strong></p>
<p>Para identificarmos quem são os <em>Reference Types</em> ao invés de listar alguns, vamos ver a lista de keywords utilizadas na declaração desses tipos.</p>
<ul>
<li>class</li>
<li>interface</li>
<li>delegate</li>
<li>dynamic</li>
<li>object</li>
<li>string</li>
</ul>
<p>Vamos ao código de exemplo.</p>
<pre class="brush: csharp;">class Posicao
{
public int X { get; set; }
public int Y { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var posicao = new Posicao {X = 0, Y = 0};
        var novaPosicao = posicao;
        novaPosicao.X = 10;
        novaPosicao.Y = 15;

        Console.WriteLine("Posição X: {0} Posição Y: {1}", posicao.X, posicao.Y);
    }
}</pre>
<p>Criei uma classe chamada posição que armazena os valores para X e Y,  quando eu criei uma nova instância da classe Posição, definir os valores 0 para X e Y.</p>
<p>Logo após eu fiz <em>var novaPosicao = posicao; </em>é nesse ponto que existe a diferênça entre <strong><em>Value Types </em></strong>e <strong><em>Reference Types</em>. </strong>Ao invés de <em>novaPosicao</em> receber o valor uma cópia do valor armazenado no <strong><em>Heap </em></strong>ele também vai apontar para a mesma referência do <em><strong>Stack</strong> </em>que aponta para o valor armazenado no <strong><em>Heap. </em></strong>Então qualquer alteração feita em qualquer das duas classes, será refletida para a outra, já que elas não acessam diretamente o valor, mas sim a referência de onde o valor está armazenado.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/02/Resultado02.png" rel="lightbox[401]" title="Resultado02"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="Resultado02" src="http://www.marcioalthmann.net/wp-content/uploads/2011/02/Resultado02_thumb.png" border="0" alt="Resultado02" width="240" height="139" /></a></p>
<h3>Strings</h3>
<p>Depois de tudo isso, agora vamos as Strings, vimos que Strings fazem parte dos <em>Reference Types</em>, porém ela se comporta de uma forma diferente, vamos ao código.</p>
<pre class="brush: csharp;">static void Main(string[] args)
{
    string nome = "Márcio";
    string novoNome = nome;
    novoNome = "Márcio Althmann";

    Console.WriteLine("Nome: {0}", nome);
    Console.WriteLine("Novo nome: {0}", novoNome);
}</pre>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/02/Resultado03.png" rel="lightbox[401]" title="Resultado03"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="Resultado03" src="http://www.marcioalthmann.net/wp-content/uploads/2011/02/Resultado03_thumb.png" border="0" alt="Resultado03" width="240" height="139" /></a><br />
No resultado da para ver que, mesmo atribuindo <em>nome </em>a <em>novoNome</em> se eu alterar o valor da variável <em>novoNome</em> o valor da <em>nome</em> não é alterado.</p>
<p>No momento em que eu fiz <em>novoNome = nome; </em>a string “Marcio” foi duplicada na memória e atribuida a <em>novoNome. </em></p>
<p>No momento em que eu fiz <em>novoNome = “Marcio Althmann”, </em>uma nova string foi criada na memória e atribuida ao <em>novoNome</em>, então até o momento eu possuo 3 strings na memória.</p>
<ul>
<li>“Márcio”</li>
<li>“Márcio”</li>
<li>“Márcio Althmann”</li>
</ul>
<p>Legal Márcio, mas porque isso acontece? Bom no .NET Strings são imutáveis, ou seja não alteramos o valor depois de criado, digo no .NET porque nem todas as linguagens ou frameworks strings são imutáveis.</p>
<p>No .NET existe strings mutáveis, é só utilizar StringBuilder.</p>
<p>O que mudaria no .NET com strings mutáveis, vamos ao código.</p>
<pre class="brush: csharp;">static void Main(string[] args)
{
    string nome = "Márcio Fábio Althmann";

    // Seria possível com strings mutáveis
    // ToLower() não teria retorno
    nome.ToLower();

    // Tem que ser feito assim já que o ToLower() retorna a
    // outra string.
    nome = nome.ToLower();
}</pre>
<p>Me agrada a idéia de funcionar só com <em>nome.ToLower()</em> mas não é o caso do .NET x).</p>
<p>Muito bem, e porque strings são imutáveis?</p>
<p>Bom se alguém achar alguma documentação a respeito eu aceito uma cópia, nunca encontrei uma resposta clara sobre o assunto, ai resolvi conversar com o <a href="http://elemarjr.net/" target="_blank">Elemar Jr</a>, o cara é excelente programador, e tem um ótimo conhecimento de linguagens de baixo nível C/C++.</p>
<p>Strings são imutáveis por vários motivos, mas o mais simples e diria até mais preocupante é desempenho.</p>
<p>Imagine uma string em memória com o meu nome “Márcio Althmann”, e eu falo que é para inserir um “F.” após o “Márcio” e antes do “Althmann”, seria muito mais trabalhoso para o framework reposicionar todos os chars da strings e adicionar o “F.” do que simplesmente criar uma strings nova já no formato que eu quero.</p>
<p>Vale lembrar que strings podem possuir muitos caracteres, e quanto maior a string, mais trabalho para o framework.</p>
<h3>Tabela de Strings</h3>
<p>Antes de encerrar o artigo, vamos ver mais um assunto interessante de como o Framework é inteligente! Vamos voltar ao código que mostrei anteriormente.</p>
<pre class="brush: csharp;">static void Main(string[] args)
{
    string nome = "Márcio";
    string novoNome = nome;

    Console.WriteLine("Nome: {0}", nome);
    Console.WriteLine("Novo nome: {0}", novoNome);
}</pre>
<p>Fiz uma pequena modificação, não estou mais atribuindo um novo valor para <em>novoNome.</em></p>
<p>Seguindo o que vimos até agora eu tenho duas strings em memória, correto? Errado!</p>
<p>Felizmente é errado, simplificando, se eu tenho duas variáveis do tipo string, as duas com o mesmo valor “Marcio”, porque eu teria duas alocações de memória? Internamente o CLR controla isso, se no seu sistema você possui, por exemplo, aqueles N botões sair, 1 em cada formulário, cada botão desse, está apontando para a mesma referencia que possui o valor “Sair”.</p>
<p>Esse conceito chama <a href="http://en.wikipedia.org/wiki/String_interning" target="_blank">String Interning</a> onde eu tenho somente uma cópia para cada string diferente em memória.</p>
<p>Agora como podemos validar isso? A class String possui métodos que ajudam a definir e validar essa parte, que são <a href="http://msdn.microsoft.com/en-us/library/system.string.intern.aspx" target="_blank">String.Intern()</a> e <a href="http://msdn.microsoft.com/en-us/library/system.string.isinterned.aspx" target="_blank">String.IsInterned()</a> mas vamos testar isso de uma forma mais divertida =].</p>
<p>Para testar vamos utilizar o método abaixo.</p>
<pre class="brush: csharp;">public static unsafe void ToUpper(string valor)
{
    fixed (char* pfixed = valor)
        for (char* p = pfixed; *p != 0; p++)
            *p = char.ToUpper(*p);
}</pre>
<p>Um código um pouco diferente não é =], onde cada char da string recebe um ToUpper(), não vou entrar em muitos detalhes sobre as keywords <a href="http://msdn.microsoft.com/en-us/library/f58wzh21(v=vs.80).aspx" target="_blank">fixed</a> e <a href="http://msdn.microsoft.com/en-us/library/chfa2zb8(v=vs.71).aspx" target="_blank">unsafe</a>, resumindo:</p>
<ul>
<li><strong>unsafe</strong>: Quando precisamos trabalhar com ponteiros.</li>
<li><strong>fixed</strong>: Previne que o Garbage Collector vai realocar a variável, e só pode ser utilizado em blocos unsafe.</li>
</ul>
<p>Um detalhe para quem vai testar, para rodar códigos com unsafe, é preciso habilitar nas propriedades do projeto, veja na imagem.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/02/unsafe.png" rel="lightbox[401]" title="unsafe"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="unsafe" src="http://www.marcioalthmann.net/wp-content/uploads/2011/02/unsafe_thumb.png" border="0" alt="unsafe" width="240" height="113" /></a></p>
<p>Voltando ao código, agora completo.</p>
<pre class="brush: csharp;">class Program
{
    static void Main(string[] args)
    {
        string nome = "Márcio";
        string novoNome = nome;

        ToUpper(nome);

        Console.WriteLine("Nome: {0}", nome);
        Console.WriteLine("Novo nome: {0}", novoNome);
    }

    public static unsafe void ToUpper(string valor)
    {
        fixed (char* pfixed = valor)
            for (char* p = pfixed; *p != 0; p++)
                *p = char.ToUpper(*p);
    }
}</pre>
<p>Repare que eu só passo a variável <em>nome</em> para o método ToUpper() criado, e depois escrevo as duas variáveis na tela, o resultado é que as duas ficaram maiusculas, já que alterei diretamente a única string com o valor “Marcio” em memória, e as duas variáveis apontam para esse valor em memória.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/02/Resultado04.png" rel="lightbox[401]" title="Resultado04"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border: 0px;" title="Resultado04" src="http://www.marcioalthmann.net/wp-content/uploads/2011/02/Resultado04_thumb.png" border="0" alt="Resultado04" width="240" height="139" /></a></p>
<p>Sem todo esse trabalho com unsafe, não seria possível fazer isso, porque eu teria que escrever algo do tipo <em>nome = nome.ToUpper();</em> e nesse momento seria criada uma nova string em memória com o valor “MARCIO” que é diferente de “Marcio” =].</p>
<p>Um pouco extenso o post, mas tem o que precisamos entender sobre o funcionamento dos tipos de dados do .NET, e como as strings se comportam, e é interessante estudar como o Framework trabalha, ver como é inteligente para resolver problemas, e as otimizações que ele faz, bons estudos para todos e até o próximo post.</p>
<p>Abraços.</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2011/02/entendendo-strings/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2011/02/entendendo-strings/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Brincando com o MongoDB e ASP.NET MVC</title>
		<link>http://www.marcioalthmann.net/2011/01/brincando-com-o-mongodb/</link>
		<comments>http://www.marcioalthmann.net/2011/01/brincando-com-o-mongodb/#comments</comments>
		<pubDate>Sun, 16 Jan 2011 19:51:59 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[asp.net mvc]]></category>
		<category><![CDATA[mongodb]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/2011/01/brincando-com-o-mongodb/</guid>
		<description><![CDATA[Gosta do seu SQL Server, Oracle, MySql, todos esses bancos de dados relacionais? Vamos esquecer isso um pouco hoje e ver um banco de dados orientado a documentos! O MongoDB é só um de vários bancos de dados que seguem o modelo NoSQL, segue alguns links para entendermos melhor como seria um banco de dados...<p><a href="http://www.marcioalthmann.net/2011/01/brincando-com-o-mongodb/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/01/LogoMongoDB.png" rel="lightbox[366]" title="LogoMongoDB"><img class="alignleft size-full wp-image-367" title="LogoMongoDB" src="http://www.marcioalthmann.net/wp-content/uploads/2011/01/LogoMongoDB.png" alt="" width="300" height="100" /></a>Gosta do seu SQL Server, Oracle, MySql, todos esses bancos de dados relacionais? Vamos esquecer isso um pouco hoje e ver um banco de dados orientado a documentos!</p>
<p>O <a href="http://www.mongodb.org/" target="_blank">MongoDB</a> é só um de vários bancos de dados que seguem o modelo <a href="http://pt.wikipedia.org/wiki/NoSQL" target="_blank">NoSQL</a>, segue alguns links para entendermos melhor como seria um banco de dados não relacional, e o que tem de legal nesse movimento NoSQL.</p>
<p><a href="http://www.itexto.net/devkico/?p=682" target="_blank">Henrique Lobo Weissmann &#8211; Introdução ao MongoDB</a><br />
<a href="http://weblogs.asp.net/andrenobre/archive/2010/06/23/o-movimento-nosql.aspx" target="_blank">André Nobre – O movimento NoSQL</a></p>
<h1>Instalação</h1>
<p>Para começar a brincadeira, faça download do MongoDB <a href="http://www.mongodb.org/downloads" target="_blank">aqui</a>, é um arquivo .zip com vários programas, não tem nenhum instalador como estamos acostumados =].</p>
<p>Agora um detalhe, crie a pasta data\db no C:\, então é no C:\data\db que o arquivo com nossos dados serão armazenados.</p>
<p>Após a criação da pasta é só executar o mongod.exe que veio no arquivo .zip e o MongoDB será iniciado!</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/01/MongoDbStart.jpg" rel="lightbox[366]" title="MongoDbStart"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-top: 0px; border-width: 0px;" title="MongoDbStart" src="http://www.marcioalthmann.net/wp-content/uploads/2011/01/MongoDbStart_thumb.jpg" border="0" alt="MongoDbStart" width="240" height="139" /></a></p>
<h1>Integração com .NET e LINQ</h1>
<p>Agora para facilitar o desenvolvimento, existe uma biblioteca chamada Norm que deveremos adicionar a referência ao nosso projeto.</p>
<p>A biblioteca está disponível <a href="https://github.com/atheken/NoRM" target="_blank">aqui no GitHub</a>. O legal é que podemos utilizar LINQ então vai facilitar muito o desenvolvimento.</p>
<h1>O projeto de teste</h1>
<p>Para esse teste, criei um projeto web com MVC 3, mas pode criar o que achar melhor, fiz isso que já é uma forma de estudar e ver os novos recursos do MVC 3.</p>
<p>O primeiro passo então é adicionar referência a .dll do Norm.</p>
<p>Feito isso vamos criar nossa classe que vai fazer a comunicação com o MongoDB. Criei uma classe chamada MongoDB que terá algumas operações básicas para acesso a dados, depois nos próximos artigos vamos melhorar essa classe.</p>
<pre class="brush: csharp;">using System;
using System.Linq;
using Norm;

namespace MongoDB.Models
{
    public class MongoDB
    {
        private const string StringDeConexao = "mongodb://localhost/EstudoMongoDB";

        public T Obter&lt;T&gt;(Func&lt;T, bool&gt; expressao) where T : class
        {
            using (var mongo = Mongo.Create(StringDeConexao))
            {
                return mongo.GetCollection&lt;T&gt;().AsQueryable().Where(expressao).SingleOrDefault();
            }
        }

        public IQueryable&lt;T&gt; ObterTodos&lt;T&gt;() where T : class
        {
            using (var mongo = Mongo.Create(StringDeConexao))
            {
                return mongo.GetCollection&lt;T&gt;().AsQueryable();
            }
        }

        public void Incluir&lt;T&gt;(T objeto) where T : class
        {
            using (var mongo = Mongo.Create(StringDeConexao))
            {
                mongo.GetCollection&lt;T&gt;().Insert(objeto);
            }
        }

        public void Excluir&lt;T&gt;(T objeto) where T : class
        {
            using (var mongo = Mongo.Create(StringDeConexao))
            {
                mongo.GetCollection&lt;T&gt;().Delete(objeto);
            }
        }

        public void Salvar&lt;T&gt;(T objeto) where T : class
        {
            using (var mongo = Mongo.Create(StringDeConexao))
            {
                mongo.GetCollection&lt;T&gt;().Save(objeto);
            }
        }
    }
}</pre>
<p>Um detalhe nessa classe é a <strong><em>StringDeConexao </em></strong>o /EstudoMongoDB será nome do nosso banco de dados, se nunca foi criado a primeira vez que for executado será criado.</p>
<p>O resto da classe é um trabalho simples com Generics, utilizando as classes disponíveis no Norm, ai tem tudo que precisamos para fazer nosso primeiro cadastro com o MongoDB.</p>
<p>Vamos fazer um cadastro de Estilo Musical, então criamos a class EstiloMusical que tem os últimos detalhes para o MongoDB funcionar.</p>
<pre class="brush: csharp;">using Norm;

namespace MongoDB.Models
{
    public class EstiloMusical
    {
        [MongoIdentifier]
        public ObjectId Id { get; set; }

        public string Nome { get; set; }
    }
}</pre>
<p>O Id do nosso objeto será do tipo <strong><em>ObjectId </em></strong>que está disponível no Norm, e também precisa ser decorado com oo atributo <strong><em>[MongoIdentifier].</em></strong></p>
<p>Agora segue o código pronto do EstiloMusicalController.</p>
<pre class="brush: csharp;">using System.Web.Mvc;
using MongoDB.Models;
using Norm;

namespace MongoDB.Controllers
{
    public class EstiloMusicalController : Controller
    {
        private Models.MongoDB mongoDb = new Models.MongoDB();

        //
        // GET: /EstiloMusical/

        public ActionResult Index()
        {
            return View(mongoDb.ObterTodos&lt;EstiloMusical&gt;());
        }

        //
        // GET: /EstiloMusical/Incluir

        public ActionResult Incluir()
        {
            return View();
        }

        //
        // POST: /EstiloMusical/Incluir

        [HttpPost]
        public ActionResult Incluir(EstiloMusical estiloMusical)
        {
            try
            {
                // TODO: Add insert logic here
                mongoDb.Incluir(estiloMusical);

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        //
        // GET: /EstiloMusical/Editar/1

        public ActionResult Editar(ObjectId id)
        {
            return View(mongoDb.Obter&lt;EstiloMusical&gt;(e =&gt; e.Id.Equals(id)));
        }

        //
        // POST: /EstiloMusical/Editar/1

        [HttpPost]
        public ActionResult Editar(EstiloMusical estiloMusical)
        {
            try
            {
                // TODO: Add update logic here
                mongoDb.Salvar(estiloMusical);

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        //
        // GET: /EstiloMusical/Excluir/1

        public ActionResult Excluir(ObjectId id)
        {
            return View(mongoDb.Obter&lt;EstiloMusical&gt;(e =&gt; e.Id.Equals(id)));
        }

        //
        // POST: /EstiloMusical/Excluir/1

        [HttpPost]
        public ActionResult Excluir(EstiloMusical estiloMusical)
        {
            try
            {
                // TODO: Add delete logic here
                mongoDb.Excluir(estiloMusical);

                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }
    }
}</pre>
<p>Outra classe sem segredo, não fiz validações nem regras de negócio nesse primeiro exemplo, então está tudo muito simples! Um detalhe é que quando vamos Editar ou Excluir precisamos receber um <strong><em>ObjectId </em></strong>e não um int como geralmente é feito.</p>
<p>Antes de continuar algumas imagens da aplicação funcionando.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/01/Aplicacao01.jpg" rel="lightbox[366]" title="Aplicacao01"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="Aplicacao01" src="http://www.marcioalthmann.net/wp-content/uploads/2011/01/Aplicacao01_thumb.jpg" border="0" alt="Aplicacao01" width="240" height="142" /></a> <a href="http://www.marcioalthmann.net/wp-content/uploads/2011/01/Aplicacao02.jpg" rel="lightbox[366]" title="Aplicacao02"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="Aplicacao02" src="http://www.marcioalthmann.net/wp-content/uploads/2011/01/Aplicacao02_thumb.jpg" border="0" alt="Aplicacao02" width="240" height="142" /></a> <a href="http://www.marcioalthmann.net/wp-content/uploads/2011/01/Aplicacao03.jpg" rel="lightbox[366]" title="Aplicacao03"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="Aplicacao03" src="http://www.marcioalthmann.net/wp-content/uploads/2011/01/Aplicacao03_thumb.jpg" border="0" alt="Aplicacao03" width="240" height="142" /></a></p>
<p>Como eu disse anteriormente, se o banco de dados não existe, ele será criado automaticamente a primeira vez que for utilizado, isso pode ser visto nas imagens abaixo.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/01/CriacaoBanco01.jpg" rel="lightbox[366]" title="CriacaoBanco01"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="CriacaoBanco01" src="http://www.marcioalthmann.net/wp-content/uploads/2011/01/CriacaoBanco01_thumb.jpg" border="0" alt="CriacaoBanco01" width="240" height="142" /></a> <a href="http://www.marcioalthmann.net/wp-content/uploads/2011/01/CriacaoBanco02.jpg" rel="lightbox[366]" title="CriacaoBanco02"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="CriacaoBanco02" src="http://www.marcioalthmann.net/wp-content/uploads/2011/01/CriacaoBanco02_thumb.jpg" border="0" alt="CriacaoBanco02" width="240" height="142" /></a></p>
<p>Agora que já possuimos a aplicação funcionando, o banco criado, e temos documentos do tipo EstiloMusical cadastrados, vem a melhor parte, e se criarmos mais propriedades na nossa classe EstiloMusical? E o banco? Sem problemas, novos documentos serão salvos com as propriedades a mais, e os antigos continuarão funcionando perfeitamente.</p>
<p>A classe agora ficou assim.</p>
<pre class="brush: csharp;">public class EstiloMusical
{
    [MongoIdentifier]
    public ObjectId Id { get; set; }

    public string Nome { get; set; }
    public string Descricao { get; set; }
}</pre>
<p>Veja funcionando com um cadastro novo, e editando um Estilo Musical cadastrado anteriormente, mas agora adicionando valor a nova propriedade.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/01/NovosCampos01.jpg" rel="lightbox[366]" title="NovosCampos01"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="NovosCampos01" src="http://www.marcioalthmann.net/wp-content/uploads/2011/01/NovosCampos01_thumb.jpg" border="0" alt="NovosCampos01" width="240" height="142" /></a> <a href="http://www.marcioalthmann.net/wp-content/uploads/2011/01/NovosCampos02.jpg" rel="lightbox[366]" title="NovosCampos02"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="NovosCampos02" src="http://www.marcioalthmann.net/wp-content/uploads/2011/01/NovosCampos02_thumb.jpg" border="0" alt="NovosCampos02" width="240" height="142" /></a> <a href="http://www.marcioalthmann.net/wp-content/uploads/2011/01/NovosCampos03.jpg" rel="lightbox[366]" title="NovosCampos03"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="NovosCampos03" src="http://www.marcioalthmann.net/wp-content/uploads/2011/01/NovosCampos03_thumb.jpg" border="0" alt="NovosCampos03" width="240" height="142" /></a> <a href="http://www.marcioalthmann.net/wp-content/uploads/2011/01/NovosCampos04.jpg" rel="lightbox[366]" title="NovosCampos04"><img style="background-image: none; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px; border-width: 0px;" title="NovosCampos04" src="http://www.marcioalthmann.net/wp-content/uploads/2011/01/NovosCampos04_thumb.jpg" border="0" alt="NovosCampos04" width="240" height="142" /></a></p>
<p>Posso estar muito empolgado, mas achei incrível não precisar ficar mapeando tabelas e classes como nos ORM´s, é um novo mundo, outro conceito, é tudo novo, mas que tem um poder incrível!</p>
<p>Hoje me perguntaram se seria só para projetos pequenos ou também funcionaria com projetos grandes, para responder isso é só <a href="http://www.mongodb.org/display/DOCS/Production+Deployments" target="_blank">olhar aqui</a> a lista de projetos que utilizam o MongoDB.</p>
<p><a href="http://dl.dropbox.com/u/7126976/MongoDB.rar" target="_blank">Clique aqui</a> para pegar o código fonte desse projeto e bons estudos.</p>
<p>Abraços.</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2011/01/brincando-com-o-mongodb/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2011/01/brincando-com-o-mongodb/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Novidades .NET 4&#8211;StringBuilder.Clear()</title>
		<link>http://www.marcioalthmann.net/2011/01/novidades-net-4stringbuilder-clear/</link>
		<comments>http://www.marcioalthmann.net/2011/01/novidades-net-4stringbuilder-clear/#comments</comments>
		<pubDate>Thu, 13 Jan 2011 01:04:46 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/2011/01/novidades-net-4stringbuilder-clear/</guid>
		<description><![CDATA[Mais uma dica rápida de novidades presente no .NET 4.0. A classe StringBuilder ganhou um método chamado Clear que limpa todos os caracteres da sua instância, mais simples impossível x) ! Vamos ao exemplo. static void Main(string[] args) { var stringBuilder = new System.Text.StringBuilder(); stringBuilder.Append(&#34;www.marcioalthmann.net&#34;); stringBuilder.Append(&#34;www.silverlightplanet.net.br&#34;); Console.WriteLine(&#34;Total de caracteres: {0}&#34;, stringBuilder.Length); stringBuilder.Clear(); Console.WriteLine(&#34;Total de caracteres...<p><a href="http://www.marcioalthmann.net/2011/01/novidades-net-4stringbuilder-clear/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>Mais uma dica rápida de novidades presente no .NET 4.0.</p>
<p>A classe <a href="http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx" target="_blank">StringBuilder</a> ganhou um método chamado <em>Clear</em> que limpa todos os caracteres da sua instância, mais simples impossível x) !</p>
<p>Vamos ao exemplo.</p>
<pre class="brush: csharp;">static void Main(string[] args)
{
    var stringBuilder = new System.Text.StringBuilder();
    stringBuilder.Append(&quot;www.marcioalthmann.net&quot;);
    stringBuilder.Append(&quot;www.silverlightplanet.net.br&quot;);

    Console.WriteLine(&quot;Total de caracteres: {0}&quot;, stringBuilder.Length);
    stringBuilder.Clear();
    Console.WriteLine(&quot;Total de caracteres após Clear: {0}&quot;, stringBuilder.Length);

    Console.Read();
}</pre>
<p>E o resultado.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/01/Resultado.jpg" rel="lightbox[345]" title="Resultado"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Resultado" border="0" alt="Resultado" src="http://www.marcioalthmann.net/wp-content/uploads/2011/01/Resultado_thumb.jpg" width="240" height="139" /></a></p>
<p>Dica rápida, até o próximo post.</p>
<p>Abraços.</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2011/01/novidades-net-4stringbuilder-clear/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2011/01/novidades-net-4stringbuilder-clear/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>String.IsNullOrWhiteSpace()</title>
		<link>http://www.marcioalthmann.net/2011/01/string-isnullorwhitespace/</link>
		<comments>http://www.marcioalthmann.net/2011/01/string-isnullorwhitespace/#comments</comments>
		<pubDate>Thu, 06 Jan 2011 15:20:11 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/2011/01/string-isnullorwhitespace/</guid>
		<description><![CDATA[Hoje vamos ver um método novo disponível para strings que é o IsNullOrWhiteSpace. Sempre precisamos verificar o valor de alguma propriedade, controle de tela, se ele foi informado ou não, até a versão 3.5 do .net poderíamos fazer esse tipo de validação de uma forma mais elegante com String.IsNullOfEmpty() que verificar se é null ou...<p><a href="http://www.marcioalthmann.net/2011/01/string-isnullorwhitespace/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>Hoje vamos ver um método novo disponível para strings que é o IsNullOrWhiteSpace.</p>
<p>Sempre precisamos verificar o valor de alguma propriedade, controle de tela, se ele foi informado ou não, até a versão 3.5 do .net poderíamos fazer esse tipo de validação de uma forma mais elegante com String.IsNullOfEmpty() que verificar se é null ou não possui valor. Veja abaixo.</p>
<pre class="brush: csharp;">var nome = &quot;&quot;;

// Não gosto assim!
if(nome == &quot;&quot;)
    Console.WriteLine(&quot;Nome não informado&quot;);

// Muito melhor agora!
if(String.IsNullOrEmpty(nome))
    Console.WriteLine(&quot;Nome não informado&quot;);</pre>
<p>Agora vamos imaginar uma aplicação, e se o usuário apertou a barra de espaço, nossas validações não vão funcionar, afinal espaço não é vazio nem null, então teríamos que fazer por exemplo um .Trim() para remover os espaços e ai sim validar.</p>
<pre class="brush: csharp;">var nome = &quot; &quot;;

// Não gosto assim!
if(nome.Trim() == &quot;&quot;)
    Console.WriteLine(&quot;Nome não informado&quot;);

// Muito melhor agora!
if(String.IsNullOrEmpty(nome.Trim()))
    Console.WriteLine(&quot;Nome não informado&quot;);</pre>
<p>Agora com o String.IsNullOrWhiteSpace() também temos a verificação se o conteúdo possui somente espaços.</p>
<pre class="brush: csharp;">var nome = &quot; &quot;;

// Não gosto assim!
if(nome.Trim() == &quot;&quot;)
    Console.WriteLine(&quot;Nome não informado&quot;);

// Muito melhor agora!
if(String.IsNullOrEmpty(nome.Trim()))
    Console.WriteLine(&quot;Nome não informado&quot;);

// Perfeito!
if(String.IsNullOrWhiteSpace(nome))
    Console.WriteLine(&quot;Nome não informado&quot;);</pre>
<p>Se você já usava IsNullOrEmpty aproveite o IsNullOrWhiteSpace, se nunca utilizou já está na hora =] lembrando que só para .net 4.0.</p>
<p>Abraços.</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2011/01/string-isnullorwhitespace/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2011/01/string-isnullorwhitespace/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando Gadgets com projeto de setup</title>
		<link>http://www.marcioalthmann.net/2011/01/instalando-gadgets-com-projeto-de-setup/</link>
		<comments>http://www.marcioalthmann.net/2011/01/instalando-gadgets-com-projeto-de-setup/#comments</comments>
		<pubDate>Wed, 05 Jan 2011 22:25:44 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Visual Studio .NET]]></category>
		<category><![CDATA[gadget]]></category>
		<category><![CDATA[instalação]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/2011/01/instalando-gadgets-com-projeto-de-setup/</guid>
		<description><![CDATA[Olá, tudo bem? Uma dica rápida, hoje o Felipe Pocchini apareceu desesperado no MSN (falei que falaria sobre você no post hehueue) perguntando como criar um Setup pelo Visual Studio, mas usar automaticamente a pasta AppData do usuário automaticamente. Bom pra quem nunca viu, com o Visual Studio conseguimos criar projetos de Setup, agora na...<p><a href="http://www.marcioalthmann.net/2011/01/instalando-gadgets-com-projeto-de-setup/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>Olá, tudo bem?</p>
<p>Uma dica rápida, hoje o <a href="http://www.felipepocchini.net/" target="_blank">Felipe Pocchini</a> apareceu desesperado no MSN (falei que falaria sobre você no post hehueue) perguntando como criar um Setup pelo Visual Studio, mas usar automaticamente a pasta AppData do usuário automaticamente.</p>
<p>Bom pra quem nunca viu, com o Visual Studio conseguimos criar projetos de Setup, agora na versão 2010, também tem uma versão do InstallShield, mas como não testei ainda fica para depois um review do mesmo.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/01/InstalacaoAppData01.png" rel="lightbox[334]" title="InstalacaoAppData01"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="InstalacaoAppData01" border="0" alt="InstalacaoAppData01" src="http://www.marcioalthmann.net/wp-content/uploads/2011/01/InstalacaoAppData01_thumb.png" width="240" height="153" /></a></p>
<p>O Felipe estava com problema porque ele precisava fazer a instalação de um Gadget, aqueles que ficam no desktop, e os Gadgets precisam ser instalado na pasta C:\Users\{usuariologado}\AppData\Local\Microsoft\Windows Sidebar\Gadgets.</p>
<p>O primeiro problema, e o maior deles é pegar a pasta específica do usuário que está instalando a aplicação, quando estamos criando um projeto de instalação, existe uma pasta chamada Application Folder, onde vamos jogar os arquivos que serão instalados, e essa pasta tem uma propriedade chamada DefaultLocation que é o diretório padrão onde a aplicação será instalada.</p>
<p><a href="http://www.marcioalthmann.net/wp-content/uploads/2011/01/InstalacaoAppData02.png" rel="lightbox[334]" title="InstalacaoAppData02"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px" title="InstalacaoAppData02" border="0" alt="InstalacaoAppData02" src="http://www.marcioalthmann.net/wp-content/uploads/2011/01/InstalacaoAppData02_thumb.png" width="240" height="142" /></a></p>
<p>Felizmente existem uma lista de palavras chave que indicam pastas especiais do sistema, e utilizando [LocalAppDataFolder] o instalador pega automaticamente a pasta AppData\Local do usuário.</p>
<p>A propriedade DefaultLocation na instalação do Gadget ficaria assim [LocalAppDataFolder]\Microsoft\Windows Sidebar\Gadgets\MeuGadget.</p>
<p>Além da LocalAppDataFolder temos várias outras palavras, segue a lista e <a href="http://msdn.microsoft.com/en-us/library/aa372057(VS.85).aspx" target="_blank">documentação oficial.</a></p>
<ul>
<li>AdminToolsFolder</li>
<li>AppDataFolder</li>
<li>CommonAppDataFolder</li>
<li>CommonFiles64Folder</li>
<li>CommonFilesFolder</li>
<li>DesktopFolder</li>
<li>FavoritesFolder</li>
<li>FontsFolder</li>
<li>LocalAppDataFolder</li>
<li>MyPicturesFolder</li>
<li>PersonalFolder</li>
<li>ProgramFiles64Folder</li>
<li>ProgramFilesFolder</li>
<li>ProgramMenuFolder</li>
<li>SendToFolder</li>
<li>StartMenuFolder</li>
<li>StartupFolder</li>
<li>System16Folder</li>
<li>System64Folder</li>
<li>SystemFolder</li>
<li>TempFolder</li>
<li>WindowsFolder</li>
<li>WindowsVolume</li>
</ul>
<p>Abraços e até o próximo artigo.</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2011/01/instalando-gadgets-com-projeto-de-setup/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2011/01/instalando-gadgets-com-projeto-de-setup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Max() em array de strings</title>
		<link>http://www.marcioalthmann.net/2010/12/max-em-array-de-strings/</link>
		<comments>http://www.marcioalthmann.net/2010/12/max-em-array-de-strings/#comments</comments>
		<pubDate>Fri, 03 Dec 2010 13:10:02 +0000</pubDate>
		<dc:creator>Márcio Fábio Althmann</dc:creator>
				<category><![CDATA[.NET Framework]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.marcioalthmann.net/2010/12/max-em-array-de-strings/</guid>
		<description><![CDATA[Olá, uma dica rápida aqui no blog. Um amigo estava querendo usar LINQ para obter o valor máximo de um array de strings, ele possuia os valors 90, 120 e 150, o problema de fazer isso com strings é que ela considera 90 o maior valor, para resolver isso no LINQ é simples, veja o...<p><a href="http://www.marcioalthmann.net/2010/12/max-em-array-de-strings/"> Leia mais →</a>]]></description>
			<content:encoded><![CDATA[<p>Olá, uma dica rápida aqui no blog.</p>
<p>Um amigo estava querendo usar LINQ para obter o valor máximo de um array de strings, ele possuia os valors 90, 120 e 150, o problema de fazer isso com strings é que ela considera 90 o maior valor, para resolver isso no LINQ é simples, veja o código abaixo.</p>
<pre class="brush: csharp;">string[] numeros = {"90", "120", "150"};
numeros.Max(x =&gt; int.Parse(x));</pre>
<p>Abraços.</p>
<div id="fb-like" style=""><iframe src="http://www.facebook.com/plugins/like.php?href=http://www.marcioalthmann.net/2010/12/max-em-array-de-strings/&amp;layout=button_count&amp;show_faces=false&amp;width=300&amp;action=like&amp;font=&amp;colorscheme=light&amp;locale=en_US" scrolling="no" frameborder="0" allowTransparency="true" style="border:none; overflow:hidden; width:300px; height:20px"></iframe></div>]]></content:encoded>
			<wfw:commentRss>http://www.marcioalthmann.net/2010/12/max-em-array-de-strings/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
