web-dev-qa-db-ja.com

?:?? 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" );
} 

ブリーフフライ?:??演算子で何もせず、何も返さず、複数の命令を実行する方法は?

81
Ahmed Ghoneim

[1]では、次のことはできません。これらの演算子は、値を返すように作られており、操作を実行するものではありません。

表現

a ? b : c

bがtrueの場合はaに評価され、cがfalseの場合はaに評価されます。

表現

b ?? c

bがヌルでない場合はbと評価され、cがヌルである場合はbと評価されます。

書くなら

return a ? b : c;

または

return b ?? c;

always何かを返します。

[2]の場合、「複数の操作」を実行する正しい値を返す関数を作成できますが、それはおそらくif/elseを使用するよりも悪いでしょう。

185
trutheality

三項演算子(?:)は制御フロー用に設計されておらず、条件付き割り当て用にのみ設計されています。プログラムのフローを制御する必要がある場合は、if/elseなどの制御構造を使用します。

40

?:演算子(C#リファレンス) を参照

条件演算子(?:)は、ブール式の値に応じて2つの値のいずれかを返します。条件演算子の構文は次のとおりです。

??演算子(C#リファレンス) を参照

??演算子は、null合体演算子と呼ばれ、null許容値型と参照型のデフォルト値を定義するために使用されます。 NULLでない場合は、左側のオペランドを返します。それ以外の場合は、正しいオペランドを返します。

つまり:

[パート1]

return source ?? String.Empty;

[パート2]は適用されません...

11
Akram Shahda

「何もしない」は実際には機能しませんか?

if // 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
Vinnyq12

三項演算子は、2つの値のいずれかを返します。または、条件に基づいて2つのステートメントのいずれかを実行できますが、意図しない副作用につながる可能性があるため、一般的にはお勧めできません。

bar ? () : baz();

この場合、()は何もしませんが、bazは何もしません。しかし、あなたはコードをあまり明確にしませんでした。より明確で保守しやすい、より冗長なコードを探します。

さらに、これはほとんど意味がありません:

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

()には戻り型がなく(void)、bazにはこのサンプルの呼び出し時点で不明な戻り型があるためです。彼らが同意しない場合、コンパイラは不満を言い、大声で。

3
Mike Hofer

コードの冗長性に懸念がある場合は、式を乱用するのではなく、これを記述します。

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

?:は旅程演算子です。 (私はそれを適切につづったと信じています)そしてそれは使いやすいです。ブール述語のように? iftrue:ifalse;ただし、右辺値=述語のように右辺値/左辺値が必要です。 iftrue:iffalse;

ex int i = x < 7 ? x : 7;

xが7未満の場合、xが割り当てられ、そうでない場合は7になります。

return x < 7 ? x : 7;のように、リターンで使用することもできます

繰り返しますが、上記のように、これは同じ効果があります。

だから、Source = Source == value ? Source : string.Empty;はあなたが達成しようとしているものだと信じています。

1
johnathan

?:演算子は、ブール式の値に応じて2つの値のいずれかを返します。

Condition-Expression ? Expression1 : Expression2

?:演算子の詳細については、Ternary演算子としても知られています。

1
rudenaggar

私はあなたがその演算子であり、どちらか一方を返すと仮定することができるとは思わない。特定の場合にそれを使用することはできますが、elseステートメントの置換ではありません。

0
atbebtg