[c#] 조건부? :( 삼항) 연산자 사용의 이점

표준 if-else 문과 달리? : 연산자의 장점과 단점은 무엇입니까? 명백한 것은 :

조건부? : 연산자

  • 직접 값 비교 및 ​​할당을 처리 할 때 더 짧고 간결합니다.
  • if / else 구조만큼 유연하지 않은 것 같습니다.

표준 If / Else

  • 더 많은 상황에 적용 가능 (예 : 함수 호출)
  • 종종 불필요하게 길다

가독성은 진술에 따라 각기 다른 것처럼 보입니다. ? : 연산자에 처음 노출 된 후 잠시 동안 정확히 어떻게 작동하는지 이해하는 데 시간이 걸렸습니다. 가능한 한 그것을 사용하거나 프로그래머가 아닌 많은 사람들과 함께 일한다는 점을 감안할 때 if / else를 고수하는 것이 좋습니다.



답변

기본적으로 결과 문이 매우 짧고 가독성을 희생하지 않고 if / else 등가물에 비해 간결성이 크게 증가한 경우에만 사용하는 것이 좋습니다.

좋은 예 :

int result = Check() ? 1 : 0;

나쁜 예 :

int result = FirstCheck() ? 1 : SecondCheck() ? 1 : ThirdCheck() ? 1 : 0;


답변

이것은 다른 답변에서 거의 다뤄지지 만 “표현식”은 그것이 왜 그렇게 유용한 지 설명하지 않습니다.

C ++ 및 C #과 같은 언어에서는이를 사용하여 로컬 읽기 전용 필드 (메서드 본문 내)를 정의 할 수 있습니다. 읽기 전용 필드의 값이 단일 명령문 내에서 지정되어야하므로 기존의 if / then 명령문으로는 불가능합니다.

readonly int speed = (shiftKeyDown) ? 10 : 1;

다음과 같지 않습니다.

readonly int speed;  
if (shifKeyDown)  
    speed = 10;    // error - can't assign to a readonly
else  
    speed = 1;     // error  

비슷한 방법으로 다른 코드에 3 차 표현식을 포함 할 수 있습니다. 소스 코드를 더 간결하게 만들뿐만 아니라 (결과적으로 더 읽기 쉬운 경우도 있음) 생성 된 기계어 코드를 더 간결하고 효율적으로 만들 수도 있습니다.

MoveCar((shiftKeyDown) ? 10 : 1);

… 같은 메서드를 두 번 호출하는 것보다 적은 코드를 생성 할 수 있습니다.

if (shiftKeyDown)
    MoveCar(10);
else
    MoveCar(1);

물론 더 편리하고 간결한 형식이기도합니다 (입력이 적고 반복이 적으며 if / else에서 코드 청크를 복제해야하는 경우 오류 가능성을 줄일 수 있음). 다음과 같은 깨끗한 “일반적인 패턴”사례에서 :

object thing = (reference == null) ? null : reference.Thing;

… 읽고 / 파싱 / 이해하는 것이 (한 번 익숙해지면) 장황한 if / else 등가물보다 빠르기 때문에 코드를 더 빨리 ‘grok’하는 데 도움이 될 수 있습니다.

물론 유용하다고 해서 모든 경우 에 사용 하는 것이 가장 좋은 것은 아닙니다 . 의미를 사용하여 투명 (또는 더 명확하게) 어디 코드의 짧은 비트를 위해 그것을 사용하는 경우에만 좋을 걸 ?:좀 더 복잡한 코드를 사용하는 경우, 또는 서로 내에 중첩의 원 사업자는 읽기 코드가 끔찍하게 어렵게 만들 수 있습니다 – .


답변

일반적으로 중복 코드가 많을 때 삼항 연산자를 선택합니다.

if (a > 0)
    answer = compute(a, b, c, d, e);
else
    answer = compute(-a, b, c, d, e);

삼항 연산자를 사용하면 다음과 같이 수행 할 수 있습니다.

answer = compute(a > 0 ? a : -a, b, c, d, e); 


답변

변수가 정의 된 경우 요청에서 전송 된 값으로 설정하고 그렇지 않은 경우 일부 기본값으로 설정하려는 경우 웹 개발을 수행 할 때 특히 유용합니다.


답변

정말 멋진 사용법은 다음과 같습니다.

x = foo ? 1 :
    bar ? 2 :
    baz ? 3 :
          4;


답변

조건부 연산자는 다음과 같은 짧은 조건에 적합합니다.

varA = boolB ? valC : valD;

그런 식으로 작성하는 데 시간이 덜 걸리기 때문에 가끔 사용합니다. 안타깝게도 다른 개발자가 코드를 검색하면이 분기를 놓칠 수 있습니다. 또한 코드는 일반적으로 짧지 않으므로 일반적으로? 및 : 다음과 같이 별도의 줄에 :

doSomeStuffToSomething(shouldSomethingBeDone()
    ? getTheThingThatNeedsStuffDone()
    : getTheOtherThingThatNeedsStuffDone());

그러나 if / else 블록을 사용하는 것의 큰 장점 (그리고 내가 선호하는 이유)은 나중에 들어 와서 분기에 로직을 추가하는 것이 더 쉽다는 것입니다.

if (shouldSomethingBeDone()) {
    doSomeStuffToSomething(getTheThingThatNeedsStuffDone());
    doSomeAdditionalStuff();
} else {
doSomeStuffToSomething(getTheOtherThingThatNeedsStuffDone());
}

또는 다른 조건을 추가하십시오.

if (shouldSomethingBeDone()) {
    doSomeStuffToSomething(getTheThingThatNeedsStuffDone());
    doSomeAdditionalStuff();
} else if (shouldThisOtherThingBeDone()){
    doSomeStuffToSomething(getTheOtherThingThatNeedsStuffDone());
}

그래서 결국, 그것은 당신을위한 편의 (사용하는 것이 더 짧습니다 :?)와 나중에 당신 (그리고 다른 사람들)을위한 편의에 관한 것입니다. 이것은 판결입니다 …하지만 다른 모든 코드 서식 문제와 마찬가지로, 유일한 실제 규칙은 일관성을 유지하고 코드를 유지 (또는 등급 지정!)해야하는 사람들에게 시각적으로 예의를 갖추는 것입니다.

(모든 코드는 눈으로 컴파일 됨)


답변

삼항 연산자를 사용할 때 인식해야 할 한 가지는 문이 아닌 표현식이라는 것입니다.

체계와 같은 기능적 언어에서는 구별이 존재하지 않습니다.

((> ab) ab 인 경우)

조건부? : 연산자 “if / else 구문만큼 유연하지 않은 것 같습니다.”

기능적 언어에서는 그렇습니다.

명령형 언어로 프로그래밍 할 때 일반적으로 식 (할당, 조건문 등)을 사용하는 상황에서 삼항 연산자를 적용합니다.