2009-02-05 5 views
3

나는 C#에서 Immediate If 연산자 (?:)를 피하는 것에 대해 기억하지만, 어디에서 읽었는지, 무엇인지는 모르겠습니다. 나는 조건의 결과를 결정하기 전에 참 및 거짓 부분 모두가 실행된다는 사실과 관련이 있다고 생각합니다. 이 올바른지? 아니면 VB.Net에서 이렇게입니까?가능한 즉각적인 if 연산자 (? :) C#에서?

답변

22

실제로 조건부 연산자라고하며 MSDN에서 "? :"라고합니다. 이것은 기본적으로 if-else의 속기 표기법입니다. 단, 이것은 실제로는 표현식이 아니라 표현식입니다. if에 해당하므로이 연산자에 대한주의 사항이 없습니다.

대략 읽은 내용은 VB.NET에서 약 Iif 기능입니다. 함수가되는이 호출되기 전에 모든 인자를 평가하고, 그래서

Dim s As String = Iif(person Is Nothing, String.Empty, person.FirstName) 

가 발생되고 NullReferenceException가 발생합니다.

+1

좋은 캐치, 안톤! Gerrie는 아마도 VB에서 IIf 함수에 대해 읽었을 것입니다. – Cerebrus

+0

예 VB.Net IIf 기능에 착각 할 가능성이 높습니다. 감사. –

+0

IIF 함수 (Access 2 Basic 및 초기 VBA에 다시 존재하는)는 앞에서 설명한 이유로 좋지 않습니다. VB .NET .NET 3.5의 IF 연산자는 구문 상 IIF처럼 보입니다. 그러나 다음과 같이 동작합니까? : – pipTheGeek

1

Anton의 대답 - Lambda 표현식 (LINQ-to- [some db] 등)에서이 유형을 지정하는 유일한 방법이기도합니다.

여러 가지를 테스트하는 경우 혼란을 겪을 수 있다는 단점이 있습니다. 술어가있는 /없는 유형 테스트를 다루는 예제는 discussion here을 참조하십시오.

2

"regular"if-else 블록 대신? :를 사용하는 것이 가장 큰 단점은 가독성과 유지 보수성에 관한 것입니다. 대부분의 비평가들은 if-else가? :보다 뚜렷하다고 주장하지만, 이것이 개인적인 취향에 관한 것이라고 생각한다고해도, 당신이 완전히 필요한 지점의? : 문장에 지시를 추가해야한다면 if-else를 사용하여 다시 작성함으로써 if-else를 처음부터 더 나은 선택으로 만듭니다. 당신이 내부에 논리를 추가하려고하면

+0

반환 오류 == ERR_REOF? "파일 끝": 오류 == ERR_NOMEM? "메모리 부족": 오류 == ERR_NOTFOUNT? "파일을 찾을 수 없습니다": "알 수없는 오류"; 내가 좋아하는 중첩 연산자를 완벽하게 읽을 수 있습니다. 내가 말했듯이 –

+1

은 "읽기 쉽다"는 주관적이다 :) – Raibaz

4

Console.WriteLine(MyBool ? "It's true!" : "Nope"); 

처럼 간단한 일을 위해 사용, 다음 코드는 정말 나쁜 보인다.

관련 문제