?. ¿Y? () Operadores condicionales null (Visual Basic)
Comprueba si el valor del operando izquierdo es null ( ) antes de realizar una operación de acceso a miembros ( ) o índice ( ); devuelve si el operando izquierdo se evalúa Nothing ?. como ?() Nothing Nothing . Tenga en cuenta que, en expresiones que normalmente devuelven tipos de valor, el operador condicional null devuelve Nullable<T> .
Estos operadores le ayudan a escribir menos código para controlar las comprobaciones nulas, especialmente cuando se degradan en estructuras de datos. Por ejemplo:
' 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 la comparación, el código alternativo para la primera de estas expresiones sin un operador condicional NULL es:
Dim length As Integer?
If customers IsNot Nothing Then
length = customers.Length
Else
length = Nothing
End If
A veces es necesario realizar una acción en un objeto que puede ser NULL, en función del valor de un miembro booleano en ese objeto (como la propiedad booleana en IsAllowedFreeShipping el ejemplo siguiente):
Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.
If customer IsNot Nothing AndAlso customer.IsAllowedFreeShipping Then
ApplyFreeShippingToOrders(customer)
End If
Puede acortar el código y evitar la comprobación manual de null mediante el operador condicional NULL como se muestra a continuación:
Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.
If customer?.IsAllowedFreeShipping Then ApplyFreeShippingToOrders(customer)
Los operadores de condición NULL se cortocircuitan. Si una operación de una cadena de operaciones de índice y acceso condicional a miembros devuelve , el resto de la ejecución Nothing de la cadena se detiene. En el ejemplo siguiente, C(E) no se evalúa si , o se evalúa como A B C Nothing .
A?.B?.C?(E)
Otro uso del acceso a miembros condicionales NULL es invocar delegados de una manera segura para subprocesos con mucho menos código. En el ejemplo siguiente se definen dos tipos, y NewsBroadcaster NewsReceiver . El delegado envía elementos de noticias al NewsBroadcaster.SendNews receptor.
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
Si no hay ningún elemento en la lista SendNews de invocación, el SendNews delegado produce una NullReferenceException excepción . Antes de los operadores condicionales NULL, código como el siguiente garantizaba que la lista de invocación de delegado no era Nothing :
SendNews = SendNews.Combine({SendNews, client})
If SendNews IsNot Nothing Then
SendNews("Just in...")
End If
La nueva manera es mucho más sencilla:
SendNews = SendNews.Combine({SendNews, client})
SendNews?.Invoke("Just in...")
La nueva forma de hacerlo es segura para los subprocesos porque el compilador genera código para evaluar SendNews solo una vez, manteniendo el resultado en una variable temporal. Debe llamar explícitamente al método Invoke porque no hay ninguna sintaxis de invocación del delegado null condicional SendNews?(String).