LA.Net
Reflexões sobre C#, .Net e programação em geral

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
Comments
  • # re: Nullable types e C#
    Israel Aece
    Posted @ 6/21/2005 7:46 PM
    Pelo que já vi há algum tempo, o Visual Basic .NET também terá suporte a Nullable Types, onde ficaria algo mais ou menos como:

    Sub PrintValue(ByVal i As Nullable(Of Integer))
    If i.HasValue Then
    Console.WriteLine(CInt(i))
    Else
    Console.WriteLine(“Null value!“)
    End If
    End Sub

    Acredito que somente não haverá uma espécie de "shortcut" como existe no C#, mas olha que eu até prefiro a outra forma :)
  • # re: Nullable types e C#
    Luis Abreu
    Posted @ 6/22/2005 1:34 PM
    Pois, o suporte e da plataforma ;)

    em relacao ao vb.net, foi so para "chatear" o pessoal do VB ;)
  • # re: Nullable types e C#
    Joao Paulo Carreiro
    Posted @ 6/23/2005 3:49 PM
    Eu por vezes fico surpresso com a equipa do VB.NET.

    VB.NET é suposto ser "RAD" e depois esquecem destes atalhos...

    Por mais que eu deteste esta syntax ( ?? , parece q alguem se eskeceu de algo :p ), a verdade é k é mais rapida de escrever e até nos habituamos.

    Outra coisa q falta no VB.NET 2005 e q até seria bem util sao "Anonymous Methods"...
  • # re: Nullable types e C#
    Luis Abreu
    Posted @ 6/23/2005 6:18 PM
    Viram? oiçam as palavras do mestre :P
Title  
Name  
Url
Box Code
Protected by FormShield
Comments