19

ブール値を返すメソッドを作成する 2 つの異なる方法を見てきました。

bool Case1()
{
    if (A)
        return true;
    else
        return false;
}
bool Case2()
{
    if (A)
        return true;
    return false;
}

どちらが速いですか?行を節約したり、わかりやすくしたりするためだけに書かないことは理にかなっていますかelse、それともパフォーマンスの向上はごくわずかですか?

4

5 に答える 5

35

いいえ。

コードを見ILても同じILコードなので性能差はありません。あなたにとってより読みやすいものを使用してください

.method private hidebysig instance bool  Case1() cil managed
{
  // Code size       9 (0x9)
  .maxstack  1
  .locals init ([0] bool CS$1$0000,
           [1] bool CS$4$0001)
  IL_0000:  nop
  IL_0001:  ldc.i4.0
  IL_0002:  stloc.1
  IL_0003:  ldc.i4.1
  IL_0004:  stloc.0
  IL_0005:  br.s       IL_0007
  IL_0007:  ldloc.0
  IL_0008:  ret
} // end of method Program::Case1

これらのコードのパフォーマンスを見てください。

http://ideone.com/8Sc7Ho --> メモリ: 33856 kB

http://ideone.com/MrnaAl --> メモリ: 33808 kB

10,000回でも使用すれば、心配することはありません。

于 2012-12-31T14:56:29.597 に答える
6

c#コンパイラは、これら2つのケースで同じILを生成する必要があるため、パフォーマンスに違いはありません。実際に何が起こっているのか知りたい場合は、生成されたILをいつでも表示できます(釣り方を教えようとします)。

IMHOCase1は読みやすく、価値があります。私の2番目の選択肢はreturn A;(他のいくつかの回答で述べられているように)です。そうAでない場合はbool、暗黙の変換があり、場合によっては混乱する可能性があります。

プロファイラーで問題があることを証明できない限り、読みやすさが勝つはずだと思います。

于 2012-12-31T14:49:35.640 に答える
5

(無視できる)違いはありません。コーディングの観点から、あなたは本当にするべきです:

return A;

しかし、コードが単なる例であると仮定すると、私は提案します:

bool Case3()
{
    bool retValue;
    if (A)
    {
        retValue = true;
    } 
    else
    { 
        retValue = false;
    }
    return retValue;
}

このようにして、何が起こっているのか、そしてどのような値が返されるのかについて非常に明確になります。戻ってメソッドの機能を変更する必要がある場合は、はるかに簡単です。

于 2012-12-31T14:52:51.583 に答える
1

パフォーマンスに関しては同じです。優れたコーディング手法の観点からは、後者をお勧めします。これにより、関数が常に有効な値を返すことが明確になります。

于 2012-12-31T14:51:15.137 に答える
0

それらは同じです。

falseの場合、どちらの場合もステートメントにAジャンプします。return false

于 2012-12-31T14:49:43.100 に答える