?:?? 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分岐を使用しないことにより、変数にアクセスするたびに無条件に(そして不必要に)変数を再割り当てします。特にマルチスレッドコードがある場合、これはすぐに悪化する可能性があります。ただそれをしないでください。
ジェフメルカード2011年

1
SourceプロパティのgetアクセサーがSourceプロパティ(そのgetアクセサー)を返している場合は、無限/再帰的な呼び出しが発生します。
ジョンK

1
最初のコードスニペットには、独自のセッター呼び出すプロパティゲッターがあり、セッター再帰的に独自のゲッターを呼び出します。そのようなことが現場でうまくいく方法はないので、あなたはそこで私を失いました。あなたの質問を洗練し、あなたが達成したいことを正確に説明してください。
フレデリックハミディ2011年

何も返さない?それがVBです。ここにc#を書いています。
タスク

@タスク私はそうする方法を意味します、この行は質問へのコメントです
Ahmed Ghoneim 2014年

回答:


198

[1]の場合、次のことはできません。これらの演算子は、演算を実行するのではなく、値を返すように作成されています。

表現

a ? b : c

評価されbている場合aに真であると評価するc場合aはfalseです。

表現

b ?? c

評価されたb場合bにはnullと評価していないc場合bはnullです。

あなたが書くなら

return a ? b : c;

または

return b ?? c;

彼らは常に何か返します。

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


41

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


5
人々がif / elseの代わりにネストされた三項式を使用し、それが読みにくく、デバッグしにくいコードを生成するのを見たことがあることを付け加えておきます。いたるところに悪いモジョ。
ckramer 2011年

4
空白が適切に使用されている場合、ネストされた三項演算子がより読みやすいコードを生成することがあります。
真実性2011年

2
@truth:はい、ネスト?:自体には何の反対もありません。しかし、制御フロー、特にネストされた制御フローに使用されることに大きな問題があります。
オリバーチャールズワース2011年

11

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

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

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

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

つまり、次のことを意味します。

[パート1]

return source ?? String.Empty;

【パート2】該当なし..。


3
それは何もしないこととは異なります。空の文字列を返します。
真実性2011年

1
もちろんですが、それはOPが求めていたものではありません。何でも-それはOPが「戻り何も」に尋ねたことを私のせいではありませんそれはおそらく意味することができます。
真実性2011年

1
@trutheality:誰もそれがあなたのせいだとは言いませんでした..しかし、OPは何も返さず、私が提供したものを返したかったのです。
Akram Shahda 2011年

3

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

if by //何も返さないというのは、実際にはnullを返すという意味です。

return Source;

つまり、コードパスを無視してから、

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

そして最後に

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

// nothing done.

3

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

bar ? () : baz();

この場合、()は何もしませんが、bazは何かをします。しかし、あなたはコードをあまり明確にしなかっただけです。より明確で保守が容易な、より詳細なコードが必要です。

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

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

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


2

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

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

私は表現を乱用しているのではなく、ただ考えているだけです!
Ahmed Ghoneim 2014年

1

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

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

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

のように、返品に使用することもできます return x < 7 ? x : 7;

繰り返しますが、上記のように、これは同じ影響を及ぼします。

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


6
私はそれが好きです。旅程演算子:それはあなたがA.に応じて... Bへ...またはAからCにAから得ることができます
リックSladkey

はい、彼は三項を意味します。しかし、正しい名前は「条件付き」です。
Erick G. Hagstrom 2016年


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.