Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Comprueba el valor del operando izquierdo para null (Nothing) antes de realizar una operación de acceso a miembros () o índice (?.?()); devuelve Nothing si el operando izquierdo se evalúa como Nothing. Tenga en cuenta que, en expresiones que normalmente devuelven tipos de valor, el operador condicional null devuelve un Nullable<T>.
Estos operadores le ayudan a escribir menos código para controlar comprobaciones nulas, especialmente cuando se descienden 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, debe 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 IsAllowedFreeShipping booleana en 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 de la siguiente manera:
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 en una cadena de acceso condicional a miembros y operaciones de índice devuelve Nothing, el resto de la ejecución de la cadena se detiene. En el ejemplo siguiente, C(E) no se evalúa si A, Bo C se evalúa como Nothing.
A?.B?.C?(E)
Tenga en cuenta que si Not someStr?.Contains("some string") o cualquier otro valor que se evalúa como Boolean? tiene el valor de nothing o HasValue=false, se ejecuta el else bloque . La evaluación sigue la evaluación de SQL en la que null/nothing no es igual a nada, ni siquiera a otro null/nothing.
Otro uso para el 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, un NewsBroadcaster y un NewsReceiver. El delegado envía elementos de noticias al receptor NewsBroadcaster.SendNews .
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 SendNews lista de invocación, el SendNews delegado produce una NullReferenceExceptionexcepción . Antes de los operadores condicionales NULL, el código como el siguiente garantizaba que la lista de invocación de delegado no Nothingera :
SendNews = SendNews.Combine({SendNews, client})
If SendNews IsNot Nothing Then
SendNews("Just in...")
End If
La nueva forma es mucho más sencilla:
SendNews = SendNews.Combine({SendNews, client})
SendNews?.Invoke("Just in...")
La nueva forma es segura para 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 Invoke método porque no hay ninguna sintaxis SendNews?(String)de invocación de delegado condicional null.