Carlos Mattos

Tipos Nulos (Nullable Types) no C#

Introdução

Os tipos nulos são especialmente úteis em operações envolvendo bancos de dados e outras situações que podem apresentar valores nulos em pontos onde são esperados valores tipados. Existem várias formas para o desenvolvedor contornar essas situações, neste artigo vamos explorar os operadores de tipos nulos disponíveis no C#. 

 Operadores de Tipos Nulos

No C# temos operadores que facilitam a declaração de variáveis e criação de expressões contendo valores nulos. Esses operadores são pouco conhecidos pelos programadores que estão iniciando nesta linguagem. Abaixo estão alguns exemplos que ilustram a utilização dos operadores (?) e (??) utilizados na manipulação de Tipos Nulos no C#.

 // x pode ser um Int32 ou Nulo

int? x = null;

 // y pode ser True/False ou Nulo

bool? y = null;

 // z pode ser um Double ou Nulo

double? z = null;

 A propriedade HasValue

Como mostra o exemplo acima, o operador (?) permite a atribuição de valores nulos para variáveis tipadas. Para testar o conteúdo de uma variável de Tipo Nulo o desenvolvedor pode utilizar a propriedade HasValue(). Esta propriedade retorna False se o conteúdo da variável for Nulo e True caso tenha um valor atribuído.

 // x pode ser um Int32 ou Nulo

int? x = null;

 if (x.HasValue)

   // x contém um valor inteiro válido

else

   // x contém valor nulo

 A propriedade Value

A propriedade Value retorna o valor armazenado na variável ou uma exceção do tipo  InvalidOperationException caso a variável contenha valor nulo.

 // x pode ser um Int32 ou Nulo

int? x = null;

 // y é um valor Int32

int y = 0;

 try

{

y = x.Value;

}

catch (InvalidOperationException )

{

MessageBox.Show("Operação inválida!");

}

  

O método GetValueOrDefault()

Outro método no qual o desenvolvedor pode apoiar-se é o GetValueOrDefault(). Este método retorna o valor armazenado na variável de tipo nulo ou o valor padrão para o tipo de dados da variável caso esta contenha valor nulo. Por exemplo, para uma variável declarada como bool? x = null o método GetValueOrDefault() retornará False (valor padrão para o tipo de dado boolean). Veja o código abaixo:

 // x pode ser um Int32 ou Nulo

int? x = null;

 

// y receberá valor 0 (zero) que é o valor padrão para o tipo Int32

int y = x.GetValueOrDefault();

 

O Operador (??)

Outro operador muito útil neste cenário é o operador ??. Com ele é possível determinar um valor que será à variável quando a variável testada contiver valor nulo. Veja o exemplo abaixo:

 

// variável de tipo nulo

bool? b = null;

// variável de tipo Bool

bool c = false;

 

// o operador ?? atribuirá valor True pois b é nulo

c = b ?? true;

 

// variável de tipo nulo

int? j = null;

// variável de tipo Int32

int k = 0;

 

// a variável k receberá valor 42 pois j é nulo

k = j ?? 42;

 

Conclusão

Existem diversos cenários onde precisamos manipular valores nulos. Os operadores mostrados acima, podem auxiliar o desenvolvedor na construção de expressões que manipulam valores nulos.

 

Posted: Tue, Feb 3 2009 13:29 by Carlos Mattos | with 3 comment(s) |
Filed under: ,

Comments

Alan Rodrigues said:

Fala Carlão, tudo bem?

Boa esse post sempre temos duvida em relação a forma mais facil de se trabalhar com null.

Uma duvida, a propriedade .HasValue() pode ser usada tambem para tipo datas?

Existe alguma forma facil para tratar se uma variavel do tipo data contem uma data ou não?

Caso não tenha nenhuma tratativa na tela e na base de dados esteja esperando um parametro data e o mesmo seja passado "vazio" não me lembro bem o formato mas é passado uma data com o ano que não existe, gera um erro no insert da procedure. Existe alguma forma facil de tratar isso no C#.

Lembro que no VB fazia um IF para verificar se a Data que esta sendo passada para a procedure era diferente de #12:00:00 AM# e diferente de #12:00:00 PM#.

Valew, e sucesso sempre...

# February 4, 2009 7:17 AM

Felipe said:

Putz, valeu Man, há tempos buscava uma solução simples como essa.

Tks

# May 20, 2009 1:08 PM

Férnas said:

Parabéns!!! Mto bom seu post cara, foi mto util... Conseguiu dar uma esclarecida em um assunto que eu tinha duvida... agora é só pesquisar mais e mais e ir aprendendo..

Valeu, abraço!

# March 19, 2010 8:03 AM
Leave a Comment

(required) 

(required) 

(optional)
 

(required) 

If you can't read this number refresh your screen
Enter the numbers above: