Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Testa o valor do operando à esquerda para nulo (Nothing) antes de executar uma operação de acesso de membro (?.) ou índice (?()) ; retorna Nothing se o operando esquerdo for avaliado como Nothing. Observe que, em expressões que normalmente retornam tipos de valor, o operador condicional nulo retorna um Nullable<T>.
Esses operadores ajudam você a escrever menos código para lidar com verificações nulas, especialmente ao descer em estruturas de dados. Por exemplo:
' Nothing if customers is Nothing
Dim length As Integer? = customers?.Length
' Nothing if customers is Nothing
Dim first As Customer = customers?(0)
' Nothing if customers, the first customer, or Orders is Nothing
Dim count As Integer? = customers?(0)?.Orders?.Count()
Para comparação, o código alternativo para a primeira dessas expressões sem um operador condicional nulo é:
Dim length As Integer?
If customers IsNot Nothing Then
length = customers.Length
Else
length = Nothing
End If
Às vezes, você precisa executar uma ação em um objeto que pode ser nulo, com base no valor de um membro booliano nesse objeto (como a propriedade booliana IsAllowedFreeShipping no exemplo a seguir):
Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.
If customer IsNot Nothing AndAlso customer.IsAllowedFreeShipping Then
ApplyFreeShippingToOrders(customer)
End If
Você pode reduzir o código e evitar a verificação manual de nulo usando o operador condicional nulo da seguinte maneira:
Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.
If customer?.IsAllowedFreeShipping Then ApplyFreeShippingToOrders(customer)
Os operadores condicionais nulos estão entrando em curto-circuito. Se uma operação em uma cadeia de operações de índice e acesso de membro condicional retornar Nothing, o restante da execução da cadeia será interrompida. No exemplo a seguir, C(E) não é avaliado se A, Bou C é avaliado como Nothing.
A?.B?.C?(E)
Observe que se Not someStr?.Contains("some string") ou qualquer outro valor que seja avaliado como Boolean? tem o valor de nothing ou HasValue=false, o else bloco será executado. A avaliação segue a avaliação do SQL em que nulo/nada não é igual a nada, nem mesmo outro nulo/nada.
Outro uso para acesso de membro condicional nulo é invocar delegados de forma thread-safe com muito menos código. O exemplo a seguir define dois tipos, a NewsBroadcaster e um NewsReceiver. Os itens de notícias são enviados ao receptor pelo NewsBroadcaster.SendNews delegado.
Public Module NewsBroadcaster
Dim SendNews As Action(Of String)
Public Sub Main()
Dim rec As New NewsReceiver()
Dim rec2 As New NewsReceiver()
SendNews?.Invoke("Just in: A newsworthy item...")
End Sub
Public Sub Register(client As Action(Of String))
SendNews = SendNews.Combine({SendNews, client})
End Sub
End Module
Public Class NewsReceiver
Public Sub New()
NewsBroadcaster.Register(AddressOf Me.DisplayNews)
End Sub
Public Sub DisplayNews(newsItem As String)
Console.WriteLine(newsItem)
End Sub
End Class
Se não houver elementos na SendNews lista de invocação, o SendNews delegado gerará um NullReferenceException. Antes dos operadores condicionais nulos, o código como o seguinte assegurava que a lista de invocação do delegado não Nothingera:
SendNews = SendNews.Combine({SendNews, client})
If SendNews IsNot Nothing Then
SendNews("Just in...")
End If
A nova maneira é muito mais simples:
SendNews = SendNews.Combine({SendNews, client})
SendNews?.Invoke("Just in...")
A nova maneira é thread-safe porque o compilador gera código para avaliar SendNews apenas uma vez, mantendo o resultado em uma variável temporária. Você precisa chamar explicitamente o Invoke método porque não há sintaxe SendNews?(String)de invocação de delegado condicional nulo.