Tipos de Valor Anuláveis.

Às vezes trabalhamos com um tipo de valor que não tem um valor definido em certas situações.Por exemplo, um campo em um banco de dados pode ter que distinguir entre ter um valor atribuído e que tem significado e não ter um valor atribuído.Tipos de valor podem ser extendidos para aceitarem valores normais ou um valor nulo.Tal extensão é chamada de nullable type.

Cada tipo anulável é construído a partir da estrutura genérica Nullable<T>.Considere um banco de dados que rastreia atividades relacionadas a trabalho.O exemplo a seguir constrói um tipo Boolean anulável e declara uma variável desse tipo.Você pode escrever a declaração de três formas:

Dim ridesBusToWork1? As Boolean
Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)

A variável ridesBusToWork pode armazenar True, False ou nenhum valor.Inicialmente, por padrão, a variável não armazena nenhum valor, o que significa, nesse caso, que a pessoa ainda não obteve a informação.Ao passo que False pode significar que a informação foi obtida e a pessoa não toma ônibus para o trabalho.

Você pode declarar variáveis e propriedades com tipos anuláveis, e pode declarar um array com elementos de um tipo anulável.Você pode declarar procedimentos com tipos anuláveis como parâmetros, e pode retornar um tipo anulável a partir de um procedimento Function.

Você não pode construir um tipo anulável em um tipo de referência tais como, array, uma String, ou uma classe.O tipo subjacente deve ser um tipo de valor.Para obter mais informações, consulte Tipos de valores e tipos de referências.

Usando uma variável de tipo anulável

Os membros mais importantes de um tipo anulável são suas propriedades HasValue e Value.Para uma variável de um tipo anulável HasValue informa se a variável contém um valor definido.Se HasValue for True, você pode ler o valor a partir de Value.Observe que tanto HasValue e Value são propriedades ReadOnly.

Valores padrão

Quando se declara uma variável com um valor anulável, sua propriedade HasValue tem um valor padrão False.Isso significa que a variável não tem, por padrão, valor definido, em vez do valor padrão de seu tipo de valor subjacente.No exemplo seguinte, a variável numberOfChildrennão tem valor definido inicialmente, mesmo que o valor padrão do tipo Integer seja 0.

Dim numberOfChildren? As Integer

Um valor nulo é útil para indicar um valor não conhecido ou indefinido.Se numberOfChildren tivesse sido declarado como Integer, não haveria valor que pudesse indicar que a informação não está disponível atualmente.

Valores de Armazenamento

Você armazena um valor em uma variável ou propriedade de um tipo anulável de maneira normal.O exemplo a seguir atribui um valor à variável numberOfChildren declarada no exemplo anterior.

numberOfChildren = 2

Se uma variável ou propriedade de um tipo anulável contiver um valor definido, você pode revertê-la para seu estado inicial sem valor atribuído.Para fazê-lo, basta definir a variável ou propriedade para Nothing, como o exemplo a seguir mostra.

numberOfChildren = Nothing
Observação:

Embora você possa atribuir Nothing a uma variável de um tipo que permite valor nulo, você não é possível testá-lo para Nothing usando o sinal de igual. Comparação que utiliza o sinal de igualdade,someVar = Nothing, sempre gera Nothing como resultado.Você pode testar a propriedade HasValue da variável para False, ou testar utilizando os operadores Is ou IsNot.

Recuperando Valores

Para recuperar o valor de uma variável ou tipo anulável, você deve, primeiramente, testar sua propriedade HasValue para confirmar se há valor atribuído.Se você tentar ler o valor quando HasValue for False, Visual Basic lançara uma exceção InvalidOperationException.O exemplo a seguir mostra a maneira recomendade de se ler a variável numberOfChildren dos exemplos anteriores.

If numberOfChildren.HasValue Then
    MsgBox("There are " & CStr(numberOfChildren) & " children.")
Else
    MsgBox("It is not known how many children there are.")
End If

Comparando Tipos Anuláveis

Quando variáveis Boolean anuláveis são usadas em expressões Booleanas, o resultado pode ser True,False, ou Nothing.A seguir, tem-se a tabela verdade para And e Or.Como b1 e b2 têm agora três valores possíveis, existem nove combinações para se avaliar.

b1

b2

b1 And b2

b1 Or b2

Nothing

Nothing

Nothing

Nothing

Nothing

True

Nothing

True

Nothing

False

False

Nothing

True

Nothing

Nothing

True

True

True

True

True

True

False

False

True

False

Nothing

False

Nothing

False

True

False

True

False

False

False

False

Quando o valor de uma variável ou expressão Booleana for Nothing, não é true nem false.Considere o exemplo a seguir:

Dim b1? As Boolean
Dim b2? As Boolean
b1 = True
b2 = Nothing

' The following If statement displays "Expression is not true".
If (b1 And b2) Then
    Console.WriteLine("Expression is true")
Else
    Console.WriteLine("Expression is not true")
End If

' The following If statement displays "Expression is not false".
If Not (b1 And b2) Then
    Console.WriteLine("Expression is false")
Else
    Console.WriteLine("Expression is not false")
End If

Nesse exemplo, b1 And b2 gera como resultado Nothing.Como resultado, a cláusula Else é executada em cada declaração If, e a saída é a seguinte:

Expression is not true

Expression is not false

Observação:

AndAlso e OrElse, que usam avaliação do tipo short-circuit , devem avaliar os segundos operandos quando o primeiro é avaliado como Nothing.

Propagação

Se um ou ambos os operandos de uma operação aritmética, de comparação, deslocamento ou tipo for anulável, o resultado da operação também será anulável.Se ambos os operandos têm valores que não são Nothing, a operação é realizada nos valores fundamentais dos operandos, como se nenhum deles fosse um tipo anulável.No exemplo seguinte, variáveis compare1 e sum1 são de tipo implícito.Se você pousar o ponteiro do mouse sobre eles, verá que o compilador infere que ambos são de tipo anulável.

' Variable n is a nullable type, but both m and n have proper values.
Dim m As Integer = 3
Dim n? As Integer = 2

' The comparison evaluated is 3>2, but compare1 is inferred to be of 
' type Boolean?.
Dim compare1 = m > n
' The values summed are 3 and 2, but sum1 is inferred to be of type Integer?.
Dim sum1 = m + n

' The following line displays: 3 * 2 * 5 * True
Console.WriteLine(m & " * " & n & " * " & sum1 & " * " & compare1)

Se um ou ambos os operandos tem um valor Nothing, o resultado será Nothing.

' Change the value of n to Nothing.
n = Nothing

Dim compare2 = m > n
Dim sum2 = m + n

' Because the values of n, compare2, and sum2 are all Nothing, the
' following line displays 3 * * *
Console.WriteLine(m & " * " & n & " * " & sum2 & " * " & compare2)

Usando Tipos Anuláveis com Dados

Um banco de dados é um dos lugares mais importantes para se utilizar tipos anuláveis,Nem todos os objetos de banco de dados atualmente oferecem suporte a tipos anuláveis, mas o mesmo ocorre com os adaptadores de tabela gerado pelo designer.Consulte "Suporte de TableAdapter para tipos Nullable" emVisão geral do TableAdapter.

Consulte também

Tarefas

Solucionando problemas de Tipos de Dados

Conceitos

Tipos de dados no Visual Basic

Tipos de valores e tipos de referências

Visão geral do TableAdapter

Inferência de tipos local

Referência

InvalidOperationException

Se operador

Outros recursos

Implementação de tipos de dados