0

今私のアプリでは、この構造を使用しています

if (e->UserState->Equals(1)) {} //stuff 1
else if (e->UserState->Equals(2)) {} //stuff 2
... // e - EventArgs of .NET 4 WebClient class

定義したほうがいいのか

int n = (int)e->UserState;

そして、switch() を使用します

switch(n)
{
  case 1:
  //stuff 1
  break;

  case 2:
  //stuff 2
  break;
}

何らかの形でパフォーマンスに影響しますか? (e->UserState の約 15 のバリアント)

4

3 に答える 3

3

(e->UserState の約 15 のバリアント)

switch読みやすくするために、純粋にフォームに書きます。パフォーマンスに関しては、プロファイリングで確認できますが、統計的に有意な違いがあるかどうかは疑問です.

于 2012-12-19T08:55:44.943 に答える
1

値がそのテーブルへのインデックスとして使用されるジャンプのテーブルやバイナリ検索など、コンパイラーはそれを高速化するために多くのトリックを実行できるため、スイッチケースは高速になります (この場合)。
「if」の条件に変数と定数のみが含まれている場合、コンパイラは同じトリックを実行する可能性がありますが、条件内で関数/メソッドを呼び出す場合、コンパイラは各チェックを順番に実行して、この関数内で発生する可能性のある副作用を保持する必要があることに注意してください。

于 2012-12-19T09:16:27.367 に答える
0

ここでの重要な要素はパフォーマンスではなく(無視できる程度であるため)、読みやすさです。したがって、他switchの使用または方法さえ:

public static void Stuff(UserState state)
{
    // do your stuff here ...
}

これで、これを使用できます(UserState既存の列挙型であると想定)。

UserState state = (UserState)(int)e;
Stuff(state);
于 2012-12-19T09:04:38.383 に答える