Todos os programadores de .Net sabem que a primeira versão da plataforma enquadra todos os tipos numa de duas categorias: reference types e value types. O objectivo deste post não é caracterizar cada um dos tipos mas sim apresentar uma nova funcionalidade introduzida na nova versão da plataforma designada de nullable types. Uma das diferenças existentes entre os reference types e os value types reside no facto de apenas os primeiros poderem conter o valor null. Se tentarmos executar a seguinte instrução:
int i = null;
deparamo-nos imediatamente com um erro de compilação que nos informa que não podemos atribuir o valor null à variável i pois esta é do tipo inteiro (que, como é do conhecimento geral, é um value type). Infelizmente, existem algumas situações onde até dava jeito atribuir null a uma variável do tipo int (por exemplo, basta pensarmos na definição de uma coluna de uma base de dados que foi configurada para permitir a utilização de NULL - atenção: eu não sou um defensor da utilização de valores NULL em colunas de base de dados). A solução para este problema poderia passar pela construção de uma classe capaz de simular o valor null. Essa classe seria utilizada para encapsular o número inteiro fazendo assim com que fosse possível atribuir o valor null a uma variável desse tipo. A nova versão da plataforma introduz o tipo genérico Nullable<T>que pode ser utilizado neste tipo de situações. Por exemplo, se utilizarmos o seguinte código:
Nullable<int> i = null;
não obtemos nenhum erro de compilação. A utilização desta classe obriga-nos a algum código adicional sempre que pretendermos atribuir o valor da variável i a outra variável. Por exemplo, se possuirmos uma variável j e quisermos atribuir o valor de i a j temos de verificar se i contém um valor válido:
Nullable<int> i = 20;
int j = 10;
if( i.HasValue )
{
j = (int)i;
}
Note-se que a atribuição de um valor à variável segue a mesma sintaxe que a utilizada para uma variável normal uma vez que a classe Nullable<T> efectua o override do operador =. Uma observação adicional: se preferirmos, podemos utilizar a propriedade Value da classe Nullable<T> para acedermos ao valor interno encapsulado pela classe. Se acham que o código anterior os obriga a escrever muito e têm o "bom gosto" de utilizar a linguagem C# (até o João já a usa :) ) então estão com sorte: o compilador oferece alguns atalhos que simplificam o código anterior. O primeiro desses atalhos está relacionado com a declaração da variável. Assim, a declaração Nullable<int> apresentada anteriormente poderia ser substituida pelo seguinte:
int? i = 20;
A utilização do caracter ? faz com que o compilador de C# gere o mesmo tipo de código que o excerto anterior. Para além da declaração, também podemos simplificar o código utilizado para efectuar o teste relativo ao valor interno armazenado pela classe. Por exemplo, todo o código anterior poderia ser escrito através das seguintes duas linhas C#:
int? i = 2;
int j = i ?? 10;
A primeira linha começa por declarar a variável como Nullable<int> e atribuir o valor 2 a essa variável. A segunda linha atribui o valor de i a j se o valor interno for válido ou o número 10 se o valor "interno" da variável for null. E por hoje é tudo. Para a próxima fica já prometido o regresso aos posts sobre ASP.Net :)
posted on Monday, June 20, 2005 9:51 PM