C #의 '??'에 해당하는 VB.NET이 있습니까? 운영자?


180

C # ??연산자에 해당하는 VB.NET이 있습니까?


4
여기에있는 대부분의 답변 (허용 된 답변 포함)은 정확하지 않으며 기능적으로 동일하지 않습니다 ?? 모든 상황에서. 2 개의 인수가있는 if () 문이 이에 해당합니다. 그러나 두 번째 인수는 ??와 정확히 동일한 결과를 얻기 위해 중첩 될 수 있습니다. 여러 인수로.
user1751825

삼항 연산자를 의미합니까? 예 : return ((value <0)? true : false)
Zeek2

답변:


155

If()연산자를 두 개의 인수와 함께 사용하십시오 ( Microsoft documentation ).

' Variable first is a nullable type.
Dim first? As Integer = 3
Dim second As Integer = 6

' Variable first <> Nothing, so its value, 3, is returned.
Console.WriteLine(If(first, second))

second = Nothing
' Variable first <> Nothing, so the value of first is returned again. 
Console.WriteLine(If(first, second))

first = Nothing second = 6
' Variable first = Nothing, so 6 is returned.
Console.WriteLine(If(first, second))

3
If()VB 의 문장 if...?...:??연산자가 아닌 C # 의 문장과 동일 하다고 생각합니다 .
Luke T O'Brien

2
@ LukeTO'Brien 3 개의 인수와 함께 사용하면됩니다. 두 개의 인수와 함께 사용하면 그 이상입니다 ??(이 질문에 대한 또 다른 답변 : stackoverflow.com/a/20686360/1474939 )
Brian J

2
이 답변은 If 세 가지 매개 변수와 함께 VB를 사용하는 방법을 보여줍니다 . 이는 C #의 연산자 와 비슷 하지 않습니다?? . 더 나은 대답은 Code Maverick의 If with two arguments 입니다. (Nick은 몇 년 전 비슷한 대답을했지만 MSDN의 설명은 포함하지 않습니다.)
ToolmakerSteve

1
이것은 완전히 다른 질문에 대답합니다.
Marc Gravell

1
이전 의견을 이해하려면 편집 기록을보십시오.
Zev Spitz


70

허용되는 답변에는 설명이 없으며 단순히 링크 일뿐입니다.
따라서 If운영자가 MSDN에서 가져온 작동 방식을 설명하는 대답을 남기겠다고 생각했습니다 .


If 연산자 (Visual Basic)

단락 평가를 사용하여 두 값 중 하나를 조건부로 반환합니다. 만약의 연산자는 세 개의 인수 또는 두 개의 인수로 호출 할 수 있습니다.

If( [argument1,] argument2, argument3 )


연산자가 두 개의 인수로 호출 된 경우

If 의 첫 번째 인수 는 생략 할 수 있습니다. 이를 통해 두 개의 인수 만 사용하여 연산자를 호출 할 수 있습니다. 다음 목록은 If 연산자가 두 개의 인수로 호출 된 경우 에만 적용됩니다 .


부속

Term         Definition
----         ----------

argument2    Required. Object. Must be a reference or nullable type. 
             Evaluated and returned when it evaluates to anything 
             other than Nothing.

argument3    Required. Object.
             Evaluated and returned if argument2 evaluates to Nothing.


경우 부울 인수가 생략되고, 첫 번째 인자는 참조 또는 널 타입이어야한다. 첫 번째 인수가 Nothing으로 평가 되면 두 번째 인수의 값이 리턴됩니다. 다른 모든 경우에는 첫 번째 인수의 값이 반환됩니다. 다음 예는이 평가의 작동 방식을 보여줍니다.


VB

' Variable first is a nullable type. 
Dim first? As Integer = 3
Dim second As Integer = 6

' Variable first <> Nothing, so its value, 3, is returned.
Console.WriteLine(If(first, second))

second = Nothing 
' Variable first <> Nothing, so the value of first is returned again.
Console.WriteLine(If(first, second))

first = Nothing
second = 6
' Variable first = Nothing, so 6 is returned.
Console.WriteLine(If(first, second))

두 개 이상의 값을 처리하는 방법의 예 (중첩 됨 if) :

Dim first? As Integer = Nothing
Dim second? As Integer = Nothing
Dim third? As Integer = 6
' The LAST parameter doesn't have to be nullable.
'Alternative: Dim third As Integer = 6

' Writes "6", because the first two values are "Nothing".
Console.WriteLine(If(first, If(second, third)))

18

확장 방법을 사용할 수 있습니다. 이것은 SQL처럼 작동 COALESCE하며 테스트하려는 대상에 대해서는 과잉 일 수 있지만 작동합니다.

    ''' <summary>
    ''' Returns the first non-null T based on a collection of the root object and the args.
    ''' </summary>
    ''' <param name="obj"></param>
    ''' <param name="args"></param>
    ''' <returns></returns>
    ''' <remarks>Usage
    ''' Dim val as String = "MyVal"
    ''' Dim result as String = val.Coalesce(String.Empty)
    ''' *** returns "MyVal"
    '''
    ''' val = Nothing
    ''' result = val.Coalesce(String.Empty, "MyVal", "YourVal")
    ''' *** returns String.Empty
    '''
    ''' </remarks>
    <System.Runtime.CompilerServices.Extension()> _
    Public Function Coalesce(Of T)(ByVal obj As T, ByVal ParamArray args() As T) As T

        If obj IsNot Nothing Then
            Return obj
        End If

        Dim arg As T
        For Each arg In args
            If arg IsNot Nothing Then
                Return arg
            End If
        Next

        Return Nothing

    End Function

내장은 If(nullable, secondChoice)만 처리 할 수있는 이 개 널 (NULL) 선택. 여기에서 Coalesce원하는만큼의 매개 변수를 사용할 수 있습니다 . 첫 번째 null이 아닌 값이 반환되고 그 이후의 나머지 매개 변수는 평가되지 않습니다 ( AndAlso/ &&와 같은 단락OrElse /|| )


8
언어에는 내장 연산자가 있기 때문입니다. 확장 방법을 볼 이유가 없습니다.
Nick

2
나는 다른 사람의 대답을 반복하지 않을 것입니다. 단일 문으로 여러 값을 확인 해야하는 경우 대체 솔루션을 제공하는 것이 좋을 것이라고 생각했습니다. 잘못된 답변이 아니므로 하향 투표해야합니까?
StingyJack

1
구현을 제공 제네릭을 사용하여 입력 주조 / 복싱 / 언 박싱 피하기위한 한
ulty4life

4
@ 닉, 미안하지만, 당신은 그냥 잘못입니다. 통합 인수가 두 개 이상인 경우 내장 함수가 잘리지 않습니다.
toddmo

당신은 obj param을 건너 뛸 수 있고 몸을 Return args.FirstOrDefault(Function(arg) arg IsNot Nothing):-)로 만들 수 있습니다
Ulf Åkerstedt

11

이러한 솔루션의 대부분의 중요한 제한 사항은 단락되지 않는다는 것입니다. 따라서 실제로는?? .

내장 If 연산자는 이전 매개 변수가 아무 것도 평가하지 않으면 후속 매개 변수를 평가하지 않습니다.

다음 내용은 동일합니다.

씨#

var value = expression1 ?? expression2 ?? expression3 ?? expression4;

VB

dim value = if(expression1,if(expression2,if(expression3,expression4)))

이것은 모든 경우에 ??작동합니다. 런타임 버그를 쉽게 도입 할 수 있으므로 다른 솔루션은 매우주의해서 사용해야합니다.


알 수없는 수의 매개 변수가있는 경우에는 작동하지 않습니다 (로셀린 또는 codedom을 사용하여 실행 시점의 매개 변수 수와 일치하도록 명령문을 사전 컴파일하지 않은 경우).
StingyJack

@StingyJack 의도하지 않습니다. 그것은 정확히 무엇을합니까 ?? 운영자는 않습니다.
user1751825

2

If Operator (Visual Basic)에 대한 Microsoft 설명서는 여기 ( https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/if-operator )에서 확인하십시오.

If( [argument1,] argument2, argument3 )

다음은 몇 가지 예입니다 (VB.Net).

' This statement prints TruePart, because the first argument is true.
Console.WriteLine(If(True, "TruePart", "FalsePart"))

' This statement prints FalsePart, because the first argument is false.
Console.WriteLine(If(False, "TruePart", "FalsePart"))

Dim number = 3
' With number set to 3, this statement prints Positive.
Console.WriteLine(If(number >= 0, "Positive", "Negative"))

number = -1
' With number set to -1, this statement prints Negative.
Console.WriteLine(If(number >= 0, "Positive", "Negative"))

1
좋은! 댓글 삭제 중!
알렉
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.