VB.NET에 조건부 삼항 연산자가 있습니까?


446

Perl (및 기타 언어)에서 조건부 삼항 연산자는 다음과 같이 표현 될 수 있습니다.

my $foo = $bar == $buz ? $cat : $dog;

VB.NET에 비슷한 연산자가 있습니까?


13
삼항 연산자는 이항 연산자가 2를 취하고 단항 연산자가 1을 취하는 것과 같이 3 개의 피연산자를 취하는 모든 연산자입니다. ? : 연산자는 정의가 아닌 ternay 연산자의 특정 예입니다.
Zooba

답변:


597

버전에 따라 다릅니다. IfVB.NET 2008 의 연산자는 3 진 연산자 (널 병합 처리 연산자)입니다. 이것은 2008 년 이전에 소개되었지만 사용할 수 없었습니다. 추가 정보는 다음과 같습니다. Visual Basic If 공고

예:

Dim foo as String = If(bar = buz, cat, dog)

[편집하다]

2008 년 이전에는 위에서 설명한 운영자 IIf와 거의 동일하게 작동했습니다 If.

예:

Dim foo as String = IIf(bar = buz, cat, dog)

15
2008 년 이전에는 IIf로 링크에 설명 된 If 연산자와 거의 동일하게 작동했습니다.
Zooba

128
... 함수 인 Iif ()는 항상 결과와 대안을 모두 평가하는 반면, 새로운 If는 그 중 하나만 평가한다는 중요한 차이점이 있습니다.
Greg Hewgill

6
무슨 뜻입니까? (조건, 참 부분, 거짓 부분) 내가 의식해도 될까요?
kbvishnu

10
나는 거대한 C 사람이지만이 구문은 전통적인 삼항 연산자보다 깨끗합니다.
호감

11
또 다른 중요한 차이점은 Iif항상 type의 객체를 반환하는 Object반면, If(bool, obj, obj)strict on 옵션을 사용하여 유형을 확인할 수 있습니다. ( Dim var As Integer = Iif(true, 1, 2)쉽게 쓸 수 있기 때문에 옵션 엄격으로 컴파일되지 않습니다 Dim var As Integer = Iif(true, new Object(), new Object()). Dim var As Integer = If(true, 1, 2)반환 된 유형을 확인하기 때문에 옵션 엄격으로 작성할 수 있습니다 .)
Joseph Nields

78

iif는 VB6에서도 가능합니다.

Dim foo as String = iif(bar = buz, cat, dog)

이는 실제 연산자가 아니라 Microsoft.VisualBasic 네임 스페이스의 함수입니다.


31
Iif는 삼항 연산자에만 가깝습니다. 따라서 If Then Else (또는 삼항 연산자)와 같은 모든 조건에서 사용할 수는 없습니다. 예를 들어, ... 값 = IIF (1 = 1, 0, 1/0)을 날려 것이지만, 값 = 만약 (1 = 1, 0, 1/0)이없는 것
삑 삑

4
VB는 단락 평가 (AndAlso 연산자 제외)를 지원하지 않으므로 VB 프로그래머는 실제로 절반의 작업을 안전하게 평가할 수 있다고 기대하지 않습니다. 그러나 요점은 iif는 이전 버전과의 호환성을 위해 배치 된 해킹 함수입니다. 그렇지 않으면 실제 연산자가됩니다.
Kris Erickson

39
모든 VB 프로그래머를 분류하는 것이 좋습니다 ;-) 그리고 바로 가기에는 IsNot 및 OrElse가 있으므로 VB는 실제로 단락 평가를 지원합니다.
HardCode

2
Iif는 일반적인 메소드 호출이며 모든 매개 변수를 평가합니다. 삼항이 아닙니다. Se dotnetslackers.com/VB_NET/…
LosManos

3
내가 말했듯이, 그것은 진정한 연산자가 아니며 vb6은 단락 평가를 지원하지 않으므로 항상 온라인상의 모든 작업을 평가합니다.
Kris Erickson

23

If ()가 가장 비슷하지만 주의하십시오 "Option Strict off"를 설정 한 경우 암시 적 변환이 진행되는 것을

예를 들어, 조심하지 않으면 다음과 같은 시도를 할 수 있습니다.

Dim foo As Integer? = If( someTrueExpression, Nothing, 2)

"foo"에 0의 값을 줄 것이다!

내 생각 엔 '?' C #에서 동등한 연산자가 컴파일에 실패합니다.


8
완벽을 기하기 위해, 그 표현을 작성하는 더 좋은 방법은 Dim foo As Integer? = If( someTrueExpression, New Integer?, 2)입니다.
Mark Hurd

9
이 또한 발생합니다 Option Strict On. 그 이유이다 NothingVB.NET는 C #에 동등에의 default(T)발보다는 null.
Heinzi

1
누군가에 의해 의아해을 위해 그리고 Integer?그것은이 널 (NULL)의 의미 - 볼 stackoverflow.com/questions/3628757/make-an-integer-null
AJV JSY에게

1
nullable 형식에 대한 암시 적 변환에 갇히지 누군가를 위해 - 볼 이유에이 답변해결 방법에 대한이 답변 반환하기 전에 인수 캐스트 ( CType(Nothing, DateTime?)을.
KyleMit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.