-6

以下のクラスの論理if-elseステートメントは、c#で許可されている限り短いですか、それともこのステートメントをさらに短くすることはできますか?

?: ここMSDNのロジック構造は、状況によってはショートカットですが、以下の場合はショートカットではありませんか?

class Stats
{
    public int Total = 0;
    public int Missed = 0;
    public int Correct = 0;
    public int Accuracy = 0;

    void Update(Boolean correctKey)
    {
        //correctKey ? Correct++ : Missed++; //incorrect syntax for this situation as the ? operator is used to set a value
        if (correctKey==true) Correct++;  else  Missed++; //shortest c# syntax?
    }
}
4

6 に答える 6

5

条件演算子は、 /ステートメントの一般化された置換としてではなく、代入で使用することを意図しています。これは、結果(式) が生成され、その結果が別のものに割り当てられるためです。ifelse

たとえば、次のステートメントを考えてみましょう。

var a = x != null ? x : y;

variable の値がnull でない場合はaobjectに設定され、null の場合は object に設定されます。ここでの目標は読みやすさです。一部のプログラマーは、 /ブロックに広がるよりも、このような非常に一般的で単純なロジックを 1 行にまとめたステートメントの方が読みやすいと感じています。xyifelse

(このパターンは、null 合体演算子があるため、C# では本質的に時代錯誤ですが、適切な説明のケースとして機能します。)

逆に、ここで表現しようとしているものは、結果がなく、割り当てを実行していないため、条件演算子では実際には機能しません。

ifこの場合、 /elseブロックが最良の選択であると言えます。短いコードが必ずしも高速なコードを生成するとは限らないことに注意してください。実際、ほとんどの場合、コンパイラまたは JITer は、同じパフォーマンスを持つ同等のコードを生成します。条件演算子を (ab) 使用してコードを高速化しようとしないでください。コードがより明確で読みやすくなる場合にのみ使用してください。読みやすさや表現力のために何かを複数の行に分割する必要がある場合は、それを正確に行っても問題はありません。

他の例が示すように、実際にはif/elseブロックを 1 行にまとめることができます。

if (correctKey) Correct++; else Missed++;

しかし、これはコードの実行を速くするわけではなく、すべてを詰め込むだけです。実行文と同様に、意味が紛れもない場合は慎重に使用する必要があります。

于 2012-07-25T07:47:43.550 に答える
3

三項演算子は、単独で式を構成し、値を割り当てる必要があるため、update ステートメントでは機能しません。

于 2012-07-25T07:42:06.970 に答える
2

これを試して

if (correctKey) Correct++;  else  Missed++;

条件演算子は、実際に結果を出力するステートメントでのみ使用できます。

var result = correctKey ? Correct++ : Missed++;

resultCorrectまたはMissedインクリメントされる前の値になります。

于 2012-07-25T07:42:41.810 に答える
2

三項演算子は、要件に基づいていずれかのケースとして使用できます。

値が

correctKey = false;
Correct = 1;
Missed = 2;

tempVar = correctKey ? Correct++ : Missed++;  // Result: 2

また

tempVar = correctKey ? ++Correct : ++Missed;  // Result: 3 

編集:

どちらの場合も、値は増加しています。したがって、このステートメントは次のようにも記述できます。

tempVar = (correctKey ? Correct : Missed)+1;  // Result: 3
于 2012-07-25T07:43:22.987 に答える
1
var temp = correctKey == true ? Correct++ : Missed++;
于 2012-07-25T07:40:55.373 に答える
1

if(...) は、括弧内のステートメントが「true」かどうかをチェックします。書くことは可能です

 if(correctKey)
    Correct++;
 else
    Missed++;

あなたのような短いステートメントの場合:

correctKey == true ? Correct++ : Missed++;
于 2012-07-25T07:44:42.857 に答える