Do que trata o artigo

A plataforma .NET traz um enorme ganho de produtividade, permitindo ao desenvolvedor focar-se muito mais no domínio da aplicação do que em códigos de mais baixo nível, como por exemplo gerenciamento de memória. Entretanto, o desenvolvedor precisa entender como as bibliotecas da plataforma funcionam para evitar surpresas e até mesmo bugs em seus aplicativos. Neste artigo veremos alguns pontos importantes de serem lembrados, em especial por principiantes.


Para que serve

A falta de conhecimento sobre o funcionamento interno do framework .NET pode nos levar a escrever um código não otimizado e consequentemente pouco performático. Através de pequenos exemplos e dicas recapitularemos alguns conceitos importantes da plataforma .NET que podem facilitar a nossa vida e evitar algumas dores de cabeça, além de otimizar nossos aplicativos.

Em que situação o tema é útil

Na correria do dia-a-dia muitas vezes acabamos esquecendo de alguns detalhes da plataforma com a qual estamos trabalhando, o que pode fazer com que o nosso código não execute da maneira esperada ou que tenhamos que perder um tempo significativo depurando-o para entender o que está acontecendo. As pequenas dicas que veremos aqui podem reduzir essas dúvidas e consequentemente aumentar sua produtividade.

Resumo do DevMan

Neste artigo abordaremos alguns detalhes que podem parecer pequenos, mas que se o desenvolvedor não conhecer pode enfrentar problemas desnecessários em seu dia-a-dia. Vamos revisar o sistema de tipos do .NET, as diferenças entre alocação na pilha e alocação no heap, os efeitos colaterais de termos essa diferenciação (como por exemplo boxing/unboxing), abordar rapidamente o funcionamento dos tipos genéricos e, por fim, dar uma espiada em uma das novidades do .NET 4.0, que é o suporte à covariância e contravariância.

Geralmente no ambiente profissional estamos submetidos a uma grande pressão, sempre correndo atrás de prazos e metas. Com isso, é natural que o nosso foco seja voltado apenas para o resultado, muitas vezes sem parar para pensar e estudar o caminho propriamente dito.

Trazendo isso para o lado da plataforma .NET, o que acontece é que nos voltamos apenas para estudar e aprender o necessário para conseguir terminar a tarefa. Entretanto, essa correria pode resultar em um software de menor qualidade, já que não entendemos profundamente como funciona a essência do que está sendo desenvolvido. Junte a isso a recorrente falta de tempo que alegamos como desculpa para a falta de estudos fora do ambiente de trabalho e teremos um problema cada vez maior: acabamos por ter somente um conhecimento superficial das tecnologias que trabalhamos.

O que muitas vezes falta é disciplina, mas isso é um assunto para outro artigo ou até mesmo um livro. Enfim, a ideia principal deste artigo é instigar o leitor a se aprofundar um pouco mais em pequenos detalhes na plataforma .NET, que com certeza faz parte do dia-a-dia da grande maioria dos leitores (e se não faz ainda, quem está lendo este artigo tem pelo menos um certo nível de interesse em estudar esse mundo). Faremos isso através da revisão de alguns conceitos interessantes e importantes da plataforma, que muitas vezes são esquecidos, seja por desconhecimento, por parte de desenvolvedores mais iniciantes, seja por negligência, por parte de desenvolvedores mais experientes, que talvez pelo fato de nunca terem se aprofundado na plataforma, deixam de aproveitar os benefícios que alguns conceitos podem proporcionar.

Nota: Todos os exemplos ao longo do artigo foram desenvolvidos utilizando o Visual Studio 2010.

Antes de começar, crie uma nova solução e adicione dois projetos à mesma: um do tipo Test Project e outro do tipo Class Library. Utilizaremos o projeto de testes para fazer nossas experiências e a biblioteca para implementar as classes necessárias para os nossos experimentos.

Nota: Utilizaremos TDD (Test-Driven Development) nos exemplos ao longo do artigo, onde criamos os nossos testes primeiro para só então desenvolver o código necessário para que o teste passe
.

Tipos primitivos, tipos-valor e tipos-referência

A principal diferença entre um tipo-valor e um tipo-referência é que tipos-valor são armazenados na pilha (stack) e tipos-referência são armazenados no heap. Mas o que isto significa exatamente? Voltaremos a falar sobre estes conceitos mais adiante, mas primeiro vamos executar uma pequena prova de conceito para que tenhamos um contexto melhor e possamos entender as diferenças de comportamento.

...

Quer ler esse conteúdo completo? Tenha acesso completo