0

私は状況があります:

クラスで何かをする必要があります。

このように IF を使用してメソッドを変更するか、アクションごとにメソッドを作成することで、より効率的な方法は何ですか?

public value Value(int command)
        {
            if (command == 1)
            {
                DoSomething1();
            }

            if (command == 2)
            {
                DoSomething2();
            }
            else
            {
                return empty();
            }


        }

このコマンドは、さらに 50 個ほど追加される予定です。実行時のパフォーマンスと実行可能ファイルのサイズの点でどちらが優れていますか?

4

3 に答える 3

4

大まかに言えば、ある種の動的ディスパッチ システムを実装しようとしているように見えますか? それとも、ポリモーフィズムなしで特定の操作を実行したいだけですか? わかりにくいです。

とにかく、あなたが与えた例に基づいて、JITコンパイラーが一連の比較ではなく効率的なハッシュテーブルルックアップに変換するため、switchブロックが最もパフォーマンスが高いため、次のようにします。

enum Command { // observe how I use an enum instead "magic" integers
    DoSomethingX = 1,
    DoSomethingY = 2
}

public Value GetValue(Command command) {
    switch(command) {
        case Command.DoSomethingX: return DoSomethingX();
        case Command.DoSomethingY: return DoSomethingY();
        default: return GetEmpty();
    }
}

switchまた、ブロックはよりコンパクトなコードを取得することも意味することに注意してください。

于 2012-12-04T01:35:23.010 に答える
3

これはパラダイムの問題であるほどパフォーマンスの問題ではありません。

C# では、メソッドはタスクのカプセル化である必要があります。ここにあるのは、それぞれが無関係なタスクのメトリックボートロードです。それは単一のメソッドであってはなりません。将来この方法を維持しようとすることを想像してみてください。各ビットが呼び出されるたびにメソッドのどこにいるのか疑問に思いながら、これをデバッグしようとすることを想像してみてください。

これを分割すれば、生活はずっと楽になりますが、パフォーマンスにはおそらく違いはありません.

于 2012-12-04T01:35:34.710 に答える
1

別の方法の方がパフォーマンスの面ではほぼ確実に優れていますが、違いに気付く可能性はほとんどありません。ただし、別々のメソッドを使用すると、可読性が大幅に向上するはずであり、これははるかに重要です。

于 2012-12-04T01:36:59.460 に答える