C# - Os tipos Nullable (Tipos Anuláveis)


Existem situações, especialmente quando se trabalha com bases de dados, onde você quer indicar que uma variável não detém atualmente um valor válido. Para tipos de referência, você pode fazer isso com facilidade definindo a variável para null.

Mas temos um problema : Quando você define uma variável de um tipo de valor ela é alocada na memória mesmo que o seu conteúdo não tiver um valor válido.

A declaração :  Int x = null ;  o compilador vai 'reclamar' exibindo a mensagem:
 

Se você teimar em executar esse código você vai receber a seguinte mensagem::

Cannot convert null to 'int' because it is non nullabe value type

Por que
Não é possível converter null para Int.
 

Nestes casos seria adequado ter um indicador booleano associado à variável, de forma que quando o valor for válido o indicador será true , e quanto o valor for inválido, o valor será false.

Os nullabe Types ou Tipos Anuláveis permitem que você crie um tipo por valor que pode ser marcado como válido ou inválido de forma que você tenha certeza que a variável seja válida antes de ser usada.Tipos de valores regulares são chamados de tipos não anuláveis.

Obs: Tipos anulável são instâncias da struct System.Nullable .

Um tipo anulável é sempre baseado em outro tipo, chamado tipo subjacente, que já foi declarado e sobre os quais temos que:

Para criar uma variável de um tipo anulável, basta adicionar um ponto de interrogação no final do nome do tipo correspondente, na declaração da variável.

Um tipo anulável pode representar o intervalo normal de valores para o tipo de valor subjacente, além de um valor nulo adicional.

Por exemplo, o código a seguir declara uma variável do tipo int anulável. Observe que o sufixo é anexado ao nome do tipo, não ao nome da variável.

int? meuInteiro = 28;

Com essa instrução de declaração, o compilador cuida de ambas produzindo o tipo anulável e criando uma variável desse tipo.

Veja a seguir mais exemplos de tipos anuláveis:

int? i = 10;
double? d1 = 3.14;
bool? flag = null;
char? letter = 'a';
int?[] arr = new int?[10];

Obs : Os tipos Anuláveis também podem ser declarados da seguinte forma:
System.Nullable<T> variável   Exemplo:
System.Nullable<int> x = 9;

Atenção !!!  Usar um tipo anulável é como usar uma variável de qualquer outro tipo.

Para obter o valor basta ler a variável verificando antes se ela não é nula , pois neste caso ocorrerá uma exceção.

Exemplo:

if ( meuInteiro != null )
{
     Console.WriteLine("{0}", meuInteiro);
}

Você pode converter facilmente entre um tipo anulável e seu tipo correspondente não anulável.

Vejamos dois exemplos de conversão nos dois sentidos:

1- Neste exemplo temos um literal do tipo int que é implicitamente convertido para um valor do tipo int? e é usado para inicializar a variável do tipo anulável:

int? meuInteiro = 15;                  // Implicitamente converte int para int?

2- Neste exemplo a variável é convertida explicitamente para a sua versão não anulável:

int regInt = (int) meuInteiro;     // Explicitamente converte int? para int

Atribuindo valores a um Nullable Type

Você pode atribuir três tipos de valores para uma variável de um tipo anulável:

Exemplo:

int? mInteiro1, mInteiro2, mInteiro3;

mInteiro1 = 28;                // valor do tipo correspondente
mInteiro2 = mInteiro1;     // valor de um tipo nullabe
mInteiro3 = null;               // Null 

Console.WriteLine("mInteiro1: {0}, mInteiro2: {1}", mInteiro1, mInteiro2);

Conversões Explícitas

Um tipo anulável pode ser convertido para um tipo regular, seja de forma explícita usando um cast (conversão forçada), ou usando a propriedade Value.

Exemplo:

int? n = null;

//int m1 = n;              // Não compila ? Erro => Cannot implicitly convert type 'int?' to 'int'. An explicit conversion exists (are you missing a cast?
int m2 = (int) n;         // Compila, mas se x for null será lançada uma exceção.
int m3 = n.Value
;      // Compila, mas se x for null será lançada uma exceção.
 

Conversões Implícitas

Uma variável de tipo anulável pode ser definido como nulo com a palavra-chave null;

int? n1 = null;

A conversão a partir de um tipo ordinário para um tipo anulável e implícita:

int? n2;
n2 = 10;
    // Conversão Implícita;

Características dos tipos Anuláveis

O tipo Anulável  bool?

O tipo anulável bool? pode conter 3 valores distintos: true, false e null. Como tal, ele não pode ser usado em condições como como if ou while.

Exemplo: O código abaixo irá gerar um erro ao ser compilado:

bool? b = null;
if (b)            // Erro => Cannot implicitly convert type 'bool?' to 'bool'. An explicit conversion exists (are you missing a cast?)
{}

Os tipos Boleanos Anuláveis podem ser convertidos para um valor boleano explicitamente a fim de ser usado em uma sentença condicional, mas se o objeto tiver um valor null a exceção InvalidOperationException será lançada, por isso é importante verificar o valor usando a propriedade HasValue antes conversão para boleano.

Dessa forma apresentei os principais conceitos básicos sobre o Tipos Anuláveis ou Nullable Types.

Referências:


José Carlos Macoratti