;

terça-feira, 1 de março de 2011

Nullable Types

No último post, sobre null coalescing, falei sobre variáveis nullable, e prometi escrever um post explicando o que é e para que serve este tipo de variável.

No C#, os value types (int, uint, long, ulong, byte, sbyte, bool, char, double, float e decimal) ao contrário dos reference types  não aceitam o valor null, ou seja, não podem ser nulas. Por exemplo, ao declarar um inteiro desta forma int i = null o framework retorna um erro de conversão, dizendo que não pode converter nulo para inteiro. Mas o problema é que muitas vezes este recurso é necessário. Por exemplo, ao ler um campo numérico do banco  que é nulo, ou passar um nulo para um parâmetro de método, para este ser desconsiderado, sem a necessidade de uma sobrecarga deste  método. Por estes, e outros motivos, existe o nullable.

Portanto, ao declarar um value type como nullable, pode-se atribuir o valor null a esta variável. Podemos declarar um nullable de duas maneiras:

Nullable<T> nomedavariavel;

Ou

T? nomedavariavel;

Nos exemplos acima “T” é um value type. Para testar se a variável possui um valor válido (não nulo) e ler este valor, este tipo possui duas propriedades:  Value e HasValue. Ambas são readonly. HasValue indica se uma variável nullabel possui um valor não nulo. Se for true, possui valor. Se for false, é nula. A propriedade Value retorna o valor do nullable type. Para atribuir um valor a uma variável nullable, faz-se normalmente, da forma como se faz com um value type normal: variável = valor. Como disse antes, a propriedade Value é readonly e é usada apenas para recuperar o valor da variável, não para setá-lo.

Para recuperar o valor de um nullable, sem correr o risco de ter uma exceção, verifique se a variável possui valor, e depois leia o valor, desta forma:

if (variavel.HasValue)
            int y = variavel.Value

Ou desta forma:

      int y = variavel.HasValue ? variavel.Value: -1;

Ou ainda, conforme explicado no artigo anterior, usando o operador “??”:

      int y = i ?? -1;

1 comentários:

Anônimo disse...

Valeu Dino, belo post.

Uaurghhhhh!!!!

Postar um comentário