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 :
Se você teimar em executar esse
código você vai receber a seguinte mensagem:: |
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
Atribuímos um valor para um tipo anulável, da mesma forma que para um tipo de valor normal. Ex: int? x =19; ou double? d=5.023;
Usamos a
propriedade System.Nullable.GetValueOrDefault para
retornar um valor atribuído, ou o valor padrão para o tipo subjacente se o valor
for nulo.
Ex: int j =
x.GetValueOrDefault();
int? x = 10; |
int? y = 10; if (y != null) { System.Console.WriteLine(y.Value); }else{ System.Console.WriteLine("Indefinido"); } |
// A váriavel
nome é null ? if (nome.HasValue == true) { // Retorna o valor da variavel nome. System.Console.WriteLine("nome = " + num.Value); } else { System.Console.WriteLine("nome e igual a Null"); } |
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; |
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: