다음을 통해 공유


?. 그리고? () null 조건부 연산자(Visual Basic)

멤버 액세스() 또는 인덱?()스() 작업을 수행하기 전에 null(Nothing?.)에 대한 왼쪽 피연산자의 값을 테스트합니다. 왼쪽 피연산자를 계산하면 Nothing반환 Nothing 됩니다. 일반적으로 값 형식을 반환하는 식에서 null 조건부 연산 Nullable<T>자는 .

이러한 연산자는 특히 데이터 구조로 내림차순으로 내림차순으로 Null 검사를 처리하는 코드를 줄이는 데 도움이 됩니다. 다음은 그 예입니다.

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

비교를 위해 null 조건부 연산자가 없는 이러한 식 중 첫 번째 식에 대한 대체 코드는 다음과 같습니다.

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

경우에 따라 해당 개체의 부울 멤버 값(예: 다음 예제의 부울 속성 IsAllowedFreeShipping )에 따라 null일 수 있는 개체에 대해 작업을 수행해야 합니다.

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

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

다음과 같이 null 조건부 연산자를 사용하여 코드를 단축하고 null을 수동으로 확인하지 않도록 할 수 있습니다.

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

If customer?.IsAllowedFreeShipping Then ApplyFreeShippingToOrders(customer)

Null 조건부 연산자는 단락 연산자입니다. 조건부 멤버 액세스 및 인덱스 작업 체인의 한 작업이 반환 Nothing되면 나머지 체인 실행이 중지됩니다. 다음 예제 C(E) 에서는 평가되는 경우 A평가 BC 되지 않습니다.Nothing

A?.B?.C?(E)

값 또는 값이 있는 것으로 Not someStr?.Contains("some string") 평가되는 다른 Boolean?nothing 이 있으면 HasValue=false블록이 else 실행됩니다. 평가는 Null/nothing이 다른 null/nothing이 아닌 아무것도 같지 않은 SQL 평가를 따릅니다.

null 조건부 멤버 액세스의 또 다른 용도는 훨씬 적은 코드로 스레드로부터 안전한 방식으로 대리자를 호출하는 것입니다. 다음 예제에서는 두 가지 형식( a 및 a)을 NewsBroadcasterNewsReceiver정의합니다. 뉴스 항목은 대리인에 의해 수신자에게 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

호출 목록에 요소가 SendNews 없으면 대리자가 SendNews 을 throw합니다 NullReferenceException. null 조건부 연산자 이전에는 다음과 같은 코드에서 대리자 호출 목록이 아닌지 Nothing확인했습니다.

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

새로운 방법은 훨씬 더 간단합니다.

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

컴파일러가 한 번만 평가하는 SendNews 코드를 생성하여 결과를 임시 변수로 유지하기 때문에 새 방법은 스레드로부터 안전합니다. null 조건부 대리자 호출 구문SendNews?(String)이 없으므로 메서드를 명시적으로 호출 Invoke 해야 합니다.

참고하십시오