Existem algumas situações onde precisamos estabelecer que uma variável pode ser nula. Isso acontece com muita frequência quando utilizando Modelos Objeto-Relacional, onde uma “cópia” da estrutura das tabelas da base de dados é feita dentro do modelo gerado no Visual Studio em forma de classes. Declarar variáveis como anuláveis é extremamente simples, e pode ser feito assim:

// C# - Pode ser assim
System.Nullable<decimal> decimalAnulavel = null;
System.Nullable<int> inteiroAnulavel = null;
System.Nullable<bool> booleanAnulavel = null;
// C# - Ou assim
decimal? decimalAnulavel = null;
int? inteiroAnulavel = null;
bool? booleanAnulavel = null;
' VB.NET - Existe uma única maneira
Dim decimalAnulavel As Nullable(Of Decimal) = Nothing
Dim inteiroAnulavel As Nullable(Of Integer) = Nothing
Dim booleanAnulavel As Nullable(Of Boolean) = Nothing

Como exemplo, uma variável bool anulável pode receber True, False e Null.

Ao declarar uma variável como anulável, são habilitadas duas novas propriedades:
  • HasValue: determina se a variável anulável possue valor.
  • Value: contém o valor não nulo da variável

Essas duas propriedades pode ser usadas em conjunto, como o código a seguir demonstra.

// C#
if (decimalAnulavel.HasValue)
    Console.WriteLine(decimalAnulavel.Value.ToString());
else
    Console.WriteLine("Valor nulo");
' VB.NET
If (decimalAnulavel.HasValue) Then
    Console.WriteLine(decimalAnulavel.Value.ToString)
Else
    Console.WriteLine("Valor Nulo")
End If

O Operador ?? do C#

O operador ?? facilita a manipulação de tipos anuláveis. Com ele podemos informar um valor fixo caso a variável seja nula.

// C#
Console.WriteLine((decimalAnulavel ?? decimal.Zero).ToString());

No VB.NET é bem parecido, mas não existe o operador ??, então usa-se o próprio If.

' VB.NET
Console.WriteLine((If(decimalAnulavel, Decimal.Zero)).ToString())

O Operador ?: do C#

O operador ?: funciona como um If, com a sintaxe (condicao ? true : false).

// C#
Console.WriteLine((decimalAnulavel.HasValue ?
                   decimalAnulavel.Value.ToString() :
                   "Valor nulo"));

No VB.NET é bem parecido, mas não existe o operador ?:, então usa-se o próprio If.

' VB.NET
Console.WriteLine((If(decimalAnulavel.HasValue, _
                      decimalAnulavel.Value.ToString(), _
                      "Valor nulo")))

Saiba mais:

Obrigado.