IIf
C #에 상응 하는 것이 있습니까? 아니면 비슷한 지름길?
답변:
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()
연산자 를 제공합니다 . 유형 추론을 사용하여 반환되는 내용을 알고 있으며 실제로는 함수가 아닌 연산자입니다. 즉, 함수 의미가 있더라도 표현식을 미리 평가해도 문제가 없습니다.
VB.NET :
If(someBool, "true", "false")
씨#
someBool ? "true" : "false";
삼항 연산자
bool a = true;
string b = a ? "if_true" : "if_false";
booleanExpression ? trueValue : falseValue;
예:
string itemText = count > 1 ? "items" : "item";
http://zamirsblog.blogspot.com/2011/12/c-vb-equivalent-of-iif.html
거기에 진술을 넣을 수 없다는 점에서 제한적입니다. 값 (또는 값으로 반환 / 평가되는 것) 만 입력하여 반환 할 수 있습니다.
이것은 작동합니다 ( '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
그래도 원하는 것을 할 수 있습니다 .
iif
또는 삼항 연산자는 허용하면 Blah.a = Blah.a < 4 ? Console.WriteLine("asdf"); return 1: Console.WriteLine("34er") ; return 2;
작동하지만 분명히 그렇지 않은 경우 와 같이 반환 값을 넣으 십시오. 그리고 그래도 여전히 값을 설정하고 있으며 새로운 메서드를 호출하지 않습니다.