C #에서 해당하는 Iif


79

IIfC #에 상응 하는 것이 있습니까? 아니면 비슷한 지름길?


4
나는 당신이 "단락"(부울 연산자와 관련하여 특정한 의미를 가지고 있음)이 아니라 "단축"을 의미한다고 생각합니다. 맞습니까?
Blorgbeard는

답변:


120

C #에는 ?다른 C 스타일 언어와 마찬가지로 삼항 연산자가 있습니다. 그러나 이것은 IIf(); 두 가지 중요한 차이점이 있습니다.

첫 번째 차이점을 설명하기 위해이 IIf()호출에 대한 거짓 부분 인수 DivideByZeroException는 boolean 인수가 인 경우에도를 발생시킵니다 True.

IIf(true, 1, 1/0)

IIf()은 함수일 뿐이며 모든 함수와 마찬가지로 모든 인수는 호출이 이루어지기 전에 평가되어야합니다. 달리 말하면, 전통적인 의미에서 단락 IIf()되지 않습니다 . 반면에이 삼항 표현은 단락을 일으키므로 완벽하게 괜찮습니다.

(true)?1:1/0;

다른 차이점은 IIf()형식이 안전하지 않다는 것입니다. 유형의 인수를 허용하고 반환합니다 Object. 삼항 연산자 형식에 안전합니다. 유형 추론을 사용하여 어떤 유형을 처리하는지 파악합니다. 고유 한 일반 IIF(Of T)()구현을 사용하여이 문제를 매우 쉽게 수정할 수 있지만 기본적으로는 그렇지 않습니다.

IIf()C #에서 정말로 원한다면 다음 과 같이 가질 수 있습니다.

object IIf(bool expression, object truePart, object falsePart) 
{return expression?truePart:falsePart;}

또는 일반 / 유형 안전 구현 :

T IIf<T>(bool expression, T truePart, T falsePart) 
{return expression?truePart:falsePart;}

반면에 VB에서 삼항 연산자를 원하는 경우 Visual Studio 2008 이상 에서는 C #의 삼항 연산자처럼 작동 하는 새 If() 연산자 를 제공합니다 . 유형 추론을 사용하여 반환되는 내용을 알고 있으며 실제로는 함수가 아닌 연산자입니다. 즉, 함수 의미가 있더라도 표현식을 미리 평가해도 문제가 없습니다.


2
VB9는 진정한 삼항 연산자를 지원합니다. If (SomeBool, MessageBox.Show ( "True"), MessageBox.Show ( "False")) 여기에 표시 : community.bartdesmet.net/blogs/bart/archive/2007/08/31/…
snarf

1
마지막 단락에서 언급했지만 질문은 특히 IIf ()에 관한 것입니다.
Joel Coehoorn

61

VB.NET :

If(someBool, "true", "false")

씨#

someBool ? "true" : "false";

1
단순 표현식의 경우에는 해당되지만 대체 표현식에 부작용이있는 경우 두 형식이 정확히 동일하지는 않습니다. Iif (t, foo (), bar ())는 foo ()와 bar ()를 모두 호출하지만 t? foo () : bar ()는 foo () 또는 bar () 중 하나만 호출하지만 둘 다 호출하지는 않습니다. 자세한 내용은이 질문에 대한 Joel Coehoorn의 답변을 참조하십시오.
Greg Hewgill

1
두 코드 블록이 동일하도록 "IIf"대신 VB.NET의 "If"함수를 사용하도록 답변을 업데이트했습니다.
Kevin Pang 2011 년

13

삼항 연산자

bool a = true;

string b = a ? "if_true" : "if_false";

문자열 b = (a? "asdf": "dsrs"); 즉, 어떻게 작동하는지 더 잘 이해할 수 있고 (string b = a)? "sdf": "sdsdf").
barlop 2011

10

병합 연산자 ??도 유용합니다.

VB :

Return Iif( s IsNot Nothing, s, "My Default Value" )

씨#:

return s ?? "My Default Value";


1

삼항 연산자 ?

string newString = i == 1 ? "i is one" : "i is not one";

0

거기에 진술을 넣을 수 없다는 점에서 제한적입니다. 값 (또는 값으로 반환 / 평가되는 것) 만 입력하여 반환 할 수 있습니다.

이것은 작동합니다 ( 'a'는 Blah 클래스 내의 정적 정수입니다)

Blah.a=Blah.a<5?1:8;

(둥근 대괄호는 같음과 물음표 사이에 암시 적으로 있음).

이것은 작동하지 않습니다.

Blah.a = Blah.a < 4 ? Console.WriteLine("asdf") : Console.WriteLine("34er");
or
Blah.a = Blah.a < 4 ? MessageBox.Show("asdf") : MessageBox.Show("34er");

따라서 값을 반환하는 데는 C # 삼항 연산자 만 사용할 수 있습니다. 따라서 이것은 if의 축약 형과는 다릅니다. Javascript 및 아마도 다른 언어를 사용하여 여기에 명령문을 넣을 수 있습니다.


예, 메서드를 호출하는 것이 아니라 값을 설정하기 때문입니다. Action그래도 원하는 것을 할 수 있습니다 .
Kieran Foot

@KieranFoot WriteLine은 메서드입니다. 오래되었지만 If iif또는 삼항 연산자는 허용하면 Blah.a = Blah.a < 4 ? Console.WriteLine("asdf"); return 1: Console.WriteLine("34er") ; return 2; 작동하지만 분명히 그렇지 않은 경우 와 같이 반환 값을 넣으 십시오. 그리고 그래도 여전히 값을 설정하고 있으며 새로운 메서드를 호출하지 않습니다.
barlop 2010 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.