? : ?? IF | ELSE 대신 연산자


85
public string Source
{
    get
    {
        /*
        if ( Source == null ){
            return string . Empty;
        } else {
            return Source;
        }
        */
        return Source ?? string.Empty;
    }
    set
    {
        /*
        if ( Source == null ) {
            Source = string . Empty;
        } else {
            if ( Source == value ) {
                Source = Source;
            } else {
                Source = value;
            }
        }
        */
        Source == value ? Source : value ?? string.Empty;
        RaisePropertyChanged ( "Source" );
    }
}

?: ??연산자 를 If / Else로 정확히 사용할 수 있습니까 ?


내 질문 :
다음을 작성하는 방법? : ?? 연산자

[ 1 ]

if ( Source == null ){
    // Return Nothing
} else {
    return Source;
}

[2]

if ( Source == value ){
    // Do Nothing
} else {
    Source = value;
    RaisePropertyChanged ( "Source" );
} 

간단히 : 아무것도하지 않고 아무것도 반환하지 않고 ?: ??연산자로 여러 명령을 수행하는 방법은 무엇입니까?


1
그러나 동일하게 작동하지 않습니다. 조건부 if / else 분기를 사용하지 않으면 변수에 액세스 할 때마다 무조건적으로 (그리고 불필요하게) 변수를 재 할당하게됩니다. 특히 다중 스레드 코드가있는 경우에는 매우 빠르게 나빠질 수 있습니다. 그냥 하지마.
Jeff Mercado

1
Source 속성의 get 접근자가 Source 속성 (get 접근 자)을 반환하는 경우 무한 / 재귀 호출이 발생합니다.
John K

1
첫 번째 코드 스 니펫에는 자체 setter 호출 있으며 , 이는 차례로 자체 getter를 재귀 적으로 호출합니다 . 현장에서 이런 식으로 일할 방법이 없기 때문에 당신은 나를 잃었습니다. 질문을 수정하고 달성하고자하는 것을 정확히 설명하십시오.
Frédéric Hamidi 2011-06-01

아무것도 반환하지 않습니까? VB입니다. 여기에 C #을 작성하고 있습니다.
작업

@Task I 평균 어떻게 이렇게하려면,이 라인이 질문에 대한 코멘트입니다
아메드 Ghoneim

답변:


199

[1]의 경우 할 수 없습니다. 이러한 연산자는 작업을 수행하는 것이 아니라 값을 반환하도록 만들어졌습니다.

표현식

a ? b : c

로 평가 b하는 경우 a에 충실하고 평가하여 c경우 afalse입니다.

표현식

b ?? c

로 평가 b하면 bnull는 아니고, 평가 c하는 경우 bnull입니다.

당신이 쓰면

return a ? b : c;

또는

return b ?? c;

그들은 항상 무언가를 반환 할 것입니다.

[2]의 경우 "다중 연산"을 수행하는 올바른 값을 반환하는 함수를 작성할 수 있지만 if/else.


41

삼항 연산자 ( ?:)는 제어 흐름 용이 아니라 조건부 할당 용으로 만 설계되었습니다 . 프로그램의 흐름을 제어해야하는 경우 if/ 와 같은 제어 구조를 사용하십시오 else.


5
나는 사람들이 if / else 대신에 중첩 된 삼항 표현식을 사용하는 것을 보았으며 읽기 및 디버그하기 어려운 코드를 생성한다고 덧붙일 것입니다. 사방에 나쁜 모조.
ckramer

4
공백이 올바르게 사용되면 중첩 된 삼항 연산자가 더 읽기 쉬운 코드를 생성하는 경우가 있습니다.
trutheality 2011-06-01

2
@ 진실 : 예, 중첩 ?:자체 에 대해 아무것도 없습니다 . 그러나 제어 흐름, 특히 중첩 제어 흐름 에 사용되는 데 큰 문제가 있습니다 !
Oliver Charlesworth 2011 년

11

로 다스 려 : 연산자 (C # 참조)

조건부 연산자 (? :)는 부울 표현식의 값에 따라 두 값 중 하나를 반환합니다. 다음은 조건부 연산자의 구문입니다.

?? 를 참조하십시오 . 연산자 (C # 참조)

? 연산자는 null 통합 연산자라고하며 참조 형식뿐 아니라 nullable 값 형식에 대한 기본값을 정의하는 데 사용됩니다. null이 아닌 경우 왼쪽 피연산자를 반환합니다. 그렇지 않으면 오른쪽 피연산자를 반환합니다.

그것의 의미는:

[1 부]

return source ?? String.Empty;

[제 2 부] 적용 불가 ...


3
아무것도하지 않는 것과 다릅니다. 빈 문자열을 반환합니다.
trutheality 2011-06-01

1
물론입니다.하지만 OP가 요구 한 것은 아닙니다. 무엇이든 - 그것은 OP는 "반환 아무것도"를 물었다 내 잘못이 아니에요 가능성을 의미 할 수 있습니다.
trutheality

1
@trutheality : 아무도 그것이 당신의 잘못이라고 말하지 않았습니다. 그러나, OP는 아무것도 반환하고 싶지 않았고 내가 제공 한 것을 반환했습니다.
Akram Shahda

3

"아무것도하지 않음"은 실제로 작동하지 않습니까?

// Return Nothing 당신은 실제로 null을 반환하고 쓰기를 의미합니다.

return Source;

의미하는 경우 코드 경로를 무시한 다음

 if ( Source != null )
            {
                return Source;
            }
// source is null so continue on.

그리고 마지막으로

 if ( Source != value )
            { Source = value;
                RaisePropertyChanged ( "Source" );
            }

// nothing done.

3

삼항 연산자는 두 값 중 하나를 반환합니다. 또는 조건에 따라 두 개의 문 중 하나를 실행할 수 있지만 의도하지 않은 부작용이 발생할 수 있으므로 일반적으로 좋은 생각이 아닙니다.

bar ? () : baz();

이 경우 ()는 아무 일도하지 않고 baz는 어떤 일을합니다. 그러나 당신은 코드를 덜 명확하게 만들었습니다. 더 명확하고 유지하기 쉬운 더 자세한 코드를 원합니다.

또한 이것은 전혀 의미가 없습니다.

var foo = bar ? () : baz();

()에는 반환 유형이없고 (void) baz에는이 샘플의 호출 시점에서 알 수없는 반환 유형이 있기 때문입니다. 동의하지 않으면 컴파일러는 큰 소리로 불평합니다.


2

코드의 장황함에 관심이 있다면 표현식을 남용하기보다는 이것을 작성하겠습니다.

if (Source == value) return;
Source = value;
RaisePropertyChanged("Source");

나는 표현을 남용하는 것이 아니라 단지 생각하고 있습니다!
아메드 Ghoneim

1

? :는 여정 연산자입니다. (제대로 철자를 썼다고 믿습니다) 사용하기 쉽습니다. 부울 술어에서와 같이? iftrue : ifalse; 그러나 rvalue = predicate와 같이 rvalue / lvalue가 있어야합니다. iftrue : iffalse;

전의 int i = x < 7 ? x : 7;

x가 7보다 작 으면 x가 할당되고, 그렇지 않으면 7이됩니다.

다음과 같이 반환에 사용할 수도 있습니다. return x < 7 ? x : 7;

다시 말하지만, 위와 같이 동일한 영향을 미칩니다.

그래서 Source = Source == value ? Source : string.Empty;나는 당신이 달성하려는 노력이라고 믿습니다.


6
나는 그것을 좋아한다. 일정 운영자 : 그것은 A.에 따라 ... 당신이 A에서 B로 얻을 ... 또는 A에서 C에 도움
릭 Sladkey 씨

예, 그는 삼항을 의미합니다. 그러나 올바른 이름은 "조건부"입니다.
에릭 G. Hagstrom


0

나는 당신이 그 연산자가 될 수 있다고 생각하지 않으며 그 중 하나를 반환한다고 가정합니다. 특정 경우에 사용할 수 있지만 if else 문 교체는 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.