Partager via


?. et? () Opérateurs conditionnels null (Visual Basic)

Teste la valeur de l’opérande de gauche pour null (Nothing) avant d’effectuer une opération d’accès membre () ou d’index (?.?()) ; retourne Nothing si l’opérande de gauche prend Nothingla valeur . Notez que dans les expressions qui retournent généralement des types de valeurs, l’opérateur conditionnel Null retourne un Nullable<T>.

Ces opérateurs vous aident à écrire moins de code pour gérer les vérifications Null, en particulier lors de la descente dans des structures de données. Par exemple:

' 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()

Pour comparaison, le code alternatif pour la première de ces expressions sans opérateur conditionnel Null est :

Dim length As Integer?
If customers IsNot Nothing Then
   length = customers.Length
Else
    length = Nothing
End If

Parfois, vous devez effectuer une action sur un objet qui peut être null, en fonction de la valeur d’un membre booléen sur cet objet (comme la propriété IsAllowedFreeShipping booléenne dans l’exemple suivant) :

Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.

If customer IsNot Nothing AndAlso customer.IsAllowedFreeShipping Then
  ApplyFreeShippingToOrders(customer)
End If

Vous pouvez raccourcir votre code et éviter de vérifier manuellement la valeur Null à l’aide de l’opérateur conditionnel Null comme suit :

Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.

If customer?.IsAllowedFreeShipping Then ApplyFreeShippingToOrders(customer)

Les opérateurs conditionnels Null ont un effet de court-circuit. Si une opération d’une chaîne d’accès aux membres conditionnels et d’opérations d’index est retournée Nothing, le reste de l’exécution de la chaîne s’arrête. Dans l’exemple suivant, C(E) n’est pas évalué si A, Bou C est évalué à Nothing.

A?.B?.C?(E)

Notez que si Not someStr?.Contains("some string") ou toute autre valeur qui est évaluée comme Boolean? ayant la valeur ou nothingHasValue=false , le else bloc est exécuté. L’évaluation suit l’évaluation SQL où null/nothing n’est pas égal à rien, pas même une autre valeur null/rien.

Une autre utilisation pour l’accès de membre conditionnel null consiste à appeler des délégués d’une manière thread-safe avec beaucoup moins de code. L’exemple suivant définit deux types, a NewsBroadcaster et a NewsReceiver. Les éléments d’actualités sont envoyés au destinataire par le NewsBroadcaster.SendNews délégué.

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

S’il n’existe aucun élément dans la SendNews liste d’appel, le SendNews délégué lève un NullReferenceException. Avant les opérateurs conditionnels Null, le code comme celui-ci a vérifié que la liste d’appel de délégué n’était pas Nothing:

SendNews = SendNews.Combine({SendNews, client})
If SendNews IsNot Nothing Then
   SendNews("Just in...")
End If

La nouvelle façon est beaucoup plus simple :

SendNews = SendNews.Combine({SendNews, client})
SendNews?.Invoke("Just in...")

La nouvelle méthode est thread-safe, car le compilateur génère du code pour évaluer SendNews une seule fois, en conservant le résultat dans une variable temporaire. Vous devez appeler explicitement la Invoke méthode, car il n’existe aucune syntaxe SendNews?(String)d’appel de délégué conditionnel null.

Voir aussi