Clique aqui para ler todos os artigos desta edição
C# 2.0 - Tipos anuláveis
Este artigo discute |
Este artigo usa as seguintes tecnologias |
· O que são tipos anuláveis;
|
C# 2.0. |
A versão 2.0 da linguagem de programação C# introduziu uma série de extensões, como: tipos parciais, classes estáticas, métodos anônimos, tipos e métodos genéricos (generics), iterators e tipos anuláveis. Este artigo tem como objetivo explicar o novo recurso dos tipos anuláveis.
Nota: Para um bom entendimento das técnicas demonstradas nesta série sobre os novos recursos do C# 2.0, é ideal que o leitor tenha pelo menos um conhecimento básico da linguagem C#.
Em muitos casos, a necessidade de fornecer suporte a valores nulos em todos os tipos de dados é essencial. Em bancos de dados, um valor nulo em um registro, serve para indicar um dado desconhecido ou, simplesmente, omitido. Os tipos por referência suportam o valor nulo (null) para indicar que não estão referenciando nenhum objeto na memória heap. Porém, os tipos por valor não suportam valores nulos.
Existem diversas abordagens utilizadas para manipular valores nulos em tipos por valor em linguagens de programação que não fornecem suportem direto, mas todas apresentam desvantagens. Um artifício muito utilizado é o uso de um valor especial (como -1 para inteiros) para indicar o valor nulo. Porém, somente funciona se existir um valor não utilizado.
Uma outra abordagem é manter um valor booleano como indicador de valor nulo para cada campo ou variável separada. Mas, esse recurso é trabalhoso, uma vez que exige que o desenvolvedor consulte o indicador ao invés de acessar o valor diretamente. Além disso, ela não funciona bem com parâmetros e valores de retorno de métodos.
Na linguagem Java, os tipos por valor são conhecidos como tipos primitivos. Normalmente, se os tipos primitivos são utilizados em um contexto que exija o armazenamento de valores nulos, então as classes wrapper são utilizadas. As classes wrapper correspondem a tipos por referência, portanto aceitam valores nulos, que encapsulam o valor primitivo internamente em um campo.
Inicialmente, o processo de encapsular o valor primitivo numa instância da classe wrapper correspondente e retirá-lo, era trabalhoso. Porém, com a introdução do recurso de autoboxing e unboxing na versão 5.0 da linguagem Java (codinome Tiger), o processo de conversão ficou transparente para o desenvolvedor.
De qualquer modo, ainda existe a desvantagem de gerar overhead no processamento, uma vez que os tipos por referência são armazenados na memória heap e devem ser gerenciados pelo coletor de lixo (Garbage Collector). Além disso, a linguagem Java 5.0 possui oito tipos primitivos (tipos por valor) e não permite criar novos tipos por valor definidos pelo usuário, podendo fornecer as classes wrapper correspondentes para todos os tipos primitivos.
Porém, desde a primeira versão da linguagem C#, o desenvolvedor tem a opção de criar tipos por valor definidos pelo usuário: estruturas (struct). A versão 2.0 da linguagem de programação C# introduziu o recurso dos tipos anuláveis (nullable types) para resolver esse problema de forma elegante e imune de todas as desvantagens citadas anteriormente. Os tipos anuláveis fornecem suporte para valores nulos em todos os tipos por valor. Este artigo discutirá detalhadamente o funcionamento dos tipos anuláveis.
Motivação para o uso de tipos anuláveis
Nas versões anteriores a 2.0 da linguagem de programação C#, o desenvolvedor não tinha suporte direto da linguagem para criar variáveis de tipos por valor que suportam valores nulos. Os campos de tipo por valor de preenchimento opcional numa classe são boas opções para uso de tipos anuláveis.
Exemplo de uma motivação para o uso de tipos anuláveis
O exemplo a seguir cria uma classe para representar produtos no estoque de uma loja. A solução será denominada Loja e será composta por um projeto Class Library denominado Estoque e um projeto Console Application denominado TesteEstoque.
Inicialmente não será utilizado o novo recurso dos tipos anuláveis para demonstrar uma abordagem possível para permitir o uso de campos de tipos por valor com valores opcionais numa classe desenvolvida com uma versão anterior à linguagem C# 2.0.
No Visual Studio 2005, crie uma solução em branco nomeada “Loja” (File>New Project). No editor escolha Other Project Types>Visual Studio Solutions>Blank Solution).
Projeto Class Library (“Estoque”)
Crie um projeto Class Library com o nome de “Estoque” e adicione-o à solução (Add to Solution, na opção Solution da janela New Project). O projeto será composto por uma única classe denominada Produto ...