5

私はswitchステートメントがで利用できないことCodeDomとコンパイラがswitchステートメントをどのように扱うかを知っています。

したがって、多くのケースが存在する場合のパフォーマンス上の理由から、If-elseを使用したくありません。if
-elseではなくswitchステートメントを使用するのはなぜですか。

特定のケースリストのジャンプテーブルをシミュレートするコードを生成することは可能です。

switch(value) {
    case 0: return Method0();
    case 1: return Method1();
    case 4; return Method4();
}

生成されます:

    private delegate object Method();

    Method[] _jumpTable = new Method[] { Method0, Method1, null, null, Method4 };

    private object GetValue(int value)
    {
        if (value < 0 || value > 4) 
            return null;
        return _jumpTable[value]();
    }

シーケンスに穴がある場合、またはリストがまばらな場合に、ケースリストを分析して配列を生成するための最良の方法は何ですか?

4

1 に答える 1

2

コード分​​析については、Roslynプロジェクトをご覧くださいテーブルが大きく、特にスパースである場合は、if / elseの方が適している可能性があります(最新のCPUキャッシュが与えられた場合)。Roslynを使用すると、DOMをウォークして、ケース値を取得できます。この値は、(おそらく単一のlinq stmtで)並べ替えることができます。上記のスイッチに「break;」があることを意味していると思います。このようなものを実装する場合は、実際にパフォーマンスが向上することを確認するために、非常に注意深くテストします。

于 2012-12-19T21:14:02.643 に答える