Tipos de valor anulável (Visual Basic)
Às vezes, você trabalha com um tipo de valor que não tem um valor definido em determinadas circunstâncias. Por exemplo, um campo em um banco de dados pode ter que distinguir entre ter um valor atribuído que é significativo e não ter um valor atribuído. Os tipos de valor podem ser estendidos para obter seus valores normais ou um valor nulo. Tal extensão é chamada de tipo anulável.
Cada tipo de valor anulável é construído a partir da estrutura genérica Nullable<T> . Considere um banco de dados que rastreie atividades relacionadas ao trabalho. O exemplo a seguir constrói um tipo anulável Boolean
e declara uma variável desse tipo. Você pode escrever a declaração de três maneiras:
Dim ridesBusToWork1? As Boolean
Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)
A variável ridesBusToWork
pode conter um valor de True
, um valor de False
, ou nenhum valor. Seu valor padrão inicial não é nenhum valor, o que neste caso pode significar que a informação ainda não foi obtida para essa pessoa. Em contrapartida, False
pode significar que a informação foi obtida e que a pessoa não anda de autocarro para o trabalho.
Você pode declarar variáveis e propriedades com tipos de valor anulável e pode declarar uma matriz com elementos de um tipo de valor anulável. Você pode declarar procedimentos com tipos de valor nulo como parâmetros e pode retornar um tipo de valor anulável de um Function
procedimento.
Não é possível construir um tipo anulável em um tipo de referência, como uma matriz, um String
ou uma classe. O tipo subjacente deve ser um tipo de valor. Para obter mais informações, consulte Tipos de valor e tipos de referência.
Usando uma variável de tipo anulável
Os membros mais importantes de um tipo de valor anulável são suas HasValue propriedades e Value . Para uma variável de um tipo de valor anulável, HasValue informa se a variável contém um valor definido. Se HasValue for True
, você pode ler o valor de Value. Note que ambos HasValue e Value são ReadOnly
propriedades.
Valores Predefinidos
Quando você declara uma variável com um tipo de valor anulável, sua HasValue propriedade tem um valor padrão de False
. Isso significa que, por padrão, a variável não tem valor definido, em vez do valor padrão de seu tipo de valor subjacente. No exemplo a seguir, a variável numberOfChildren
inicialmente não tem valor definido, mesmo que o valor padrão do Integer
tipo seja 0.
Dim numberOfChildren? As Integer
Um valor nulo é útil para indicar um valor indefinido ou desconhecido. Se numberOfChildren
tivesse sido declarado como Integer
, não haveria nenhum valor que pudesse indicar que a informação não está atualmente disponível.
Armazenando valores
Você armazena um valor em uma variável ou propriedade de um tipo de valor anulável da maneira típica. 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 de valor anulável contiver um valor definido, você poderá fazer com que ela reverta para seu estado inicial de não ter um valor atribuído. Para fazer isso, defina a variável ou propriedade como Nothing
, como mostra o exemplo a seguir.
numberOfChildren = Nothing
Nota
Embora você possa atribuir Nothing
a uma variável de um tipo de valor anulável, não é possível testá-la Nothing
usando o sinal de igual. Comparação que usa o sinal de igual, someVar = Nothing
, sempre avalia a Nothing
. Você pode testar a propriedade da HasValue variável para False
, ou testar usando o Is
operador or IsNot
.
Recuperando valores
Para recuperar o valor de uma variável de um tipo de valor anulável, você deve primeiro testar sua HasValue propriedade para confirmar se ela tem um valor. Se você tentar ler o valor quando HasValue é False
, Visual Basic lança uma InvalidOperationException exceção. O exemplo a seguir mostra a maneira recomendada de 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 anuláveis Boolean
são usadas em expressões booleanas, o resultado pode ser True
, False
ou Nothing
. A seguir está a tabela de verdade para And
e Or
. Porque b1
e b2
agora tem três valores possíveis, há nove combinações para avaliar.
b1 | b2 | b1 E b2 | b1 Ou 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 é Nothing
, não é nem true
false
. Considere o seguinte exemplo.
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
Neste exemplo, b1 And b2
avalia como Nothing
. Como resultado, a cláusula é executada Else
em cada If
instrução e a saída é a seguinte:
Expression is not true
Expression is not false
Nota
AndAlso
e OrElse
, que usam avaliação de curto-circuito, devem avaliar seus segundos operandos quando o primeiro avalia a Nothing
.
Propagação
Se um ou ambos os operandos de uma operação aritmética, de comparação, de deslocamento ou de tipo for um tipo de valor anulável, o resultado da operação também será um tipo de valor anulável. Se ambos os operandos tiverem valores que não Nothing
são , a operação será executada nos valores subjacentes dos operandos, como se nenhum deles fosse um tipo de valor anulável. No exemplo a seguir, as variáveis compare1
e sum1
são digitadas implicitamente. Se você posicionar o ponteiro do mouse sobre eles, verá que o compilador infere tipos de valor anuláveis para ambos.
' 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 tiverem um valor de 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 * <null> * <null> * <null>
Console.WriteLine($"{m} * {If(n, "<null>")} * {If(sum2, "<null>")} * {If(compare2, "<null>")}")
Usando tipos anuláveis com dados
Um banco de dados é um dos lugares mais importantes para usar tipos de valor anuláveis. Nem todos os objetos de banco de dados atualmente oferecem suporte a tipos de valor anulável, mas os adaptadores de tabela gerados pelo designer o fazem. Consulte Suporte a TableAdapter para tipos anuláveis.