[c#] ? : ?? IF | ELSE 대신 연산자

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]의 경우 할 수 없습니다. 이러한 연산자는 작업을 수행하는 것이 아니라 값을 반환하도록 만들어졌습니다.

표현식

a ? b : c

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

표현식

b ?? c

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

당신이 쓰면

return a ? b : c;

또는

return b ?? c;

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

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


답변

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


답변

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

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

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

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

그것의 의미는:

[1 부]

return source ?? String.Empty;

[제 2 부] 적용 불가 …


답변

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

// 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.


답변

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

bar ? () : baz();

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

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

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

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


답변

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

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


답변

? :는 여정 연산자입니다. (제대로 철자를 썼다고 믿습니다) 사용하기 쉽습니다. 부울 술어에서와 같이? 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;나는 당신이 달성하려는 노력이라고 믿습니다.