Tipos de valor que permitem valor nulo (Visual Basic)
À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. 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 valor e referência.
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
Dica
Embora você possa atribuir Nothing para uma variável ou tipo anulável, você não pode testá-la para Nothing utilizando 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
Dica
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 suportam a tipos anuláveis, mas fazem de adaptadores de tabela gerado pelo designer. Consulte o "Suporte de TableAdapter para tipos anuláveis" em Visão geral de TableAdapter.
Consulte também
Tarefas
Solucionando problemas de tipos de dados (Visual Basic)
Referência
Usando tipos anuláveis (Guia de Programação em C#)