2017-03-16 8 views
4

switchステートメントを使用して、一連の条件に基づいてオブジェクトに対して何らかの処理を行います。すべての場合に呼び出されるデフォルトのケースがあります。Switch StatementパフォーマンスC#

私たちは、これにアプローチする最善の方法について意見を異にしています。

私たちの一部は、例えばAを好む:とにかく、すべての場合に呼び出されます

switch (task) 
{ 
    case A: 
     ProcessA(); 
     break; 
    case B: 
     ProcessB(); 
     break; 
    case C: 
     ProcessC(); 
     break; 
} 

Final(); 

Final()ので:

switch (task) 
{ 
    case A: 
     ProcessA(); 
     goto default; 
    case B: 
     ProcessB(); 
     goto default; 
    case C: 
     ProcessC(); 
     goto default; 
    default: 
     Final(); 
} 

他の人は、それは、例えば、Bのようなものを使用することをお勧めします示唆しているのに対し。

これは個人的な好みのケースですか、または客観的なパフォーマンスの違いがありますか。

私たちが目を向けなければならないガイドラインや問題点はありますか?

これはAPIのためにC#で書かれており、非常に頻繁に呼び出されます。私たちはそれを正しくしようと熱望しています!

乾杯!

+9

私は、C#の 'switch'の中で' goto'を使ったことはありませんでした。 – xanatos

+2

私は最初のコードを考慮に入れるべきではないと思います。それはスイッチのデフォルトが使用されているものではありません。 –

+1

ええ、それは不気味です。私は間違いなく第2の方法を好む。 C#には 'goto'というキーワードがありますが、C#のような手続き型言語に関しては穀物に逆らっているので、私は離れています。パフォーマンスとスタイルの選択については、問題が発生した場合にのみパフォーマンスに対処してください。 –

答えて

8

私は手動で周囲に「ジャンプ」するコードを挿入するにはポイントが本当にありません例B.

でスティックを言うと思います。特に、同じ場所に飛ぶすべてのケースでは特にそうではありません。これはコードブロックのためのものです。例Bははるかに優れており、従うのがずっと簡単です。

パフォーマンスに関しては、どちらが速いのかはわかりません(測定してください)。しかし、現時点では、それは気にする必要のないマイクロ最適化のように見えます。この例では、読みやすさと保守性は、得られる可能性のあるマイナーなパフォーマンスの向上を上回ると言います。

+1

いくつかのバリエーションとIL(およびパフォーマンス)のテストは、すべてのケースで基本的に同じでしたか?この回答に記載されている理由により、Bと一緒に終了しました。 –

-2

例Bは、あらゆる面で最良の答えです。

gotoを絶対に使用しないでください。コードのパフォーマンスと可読性が低下します。 CPUは、いくつかの技術を使用して、将来の命令を予測してパフォーマンス低下を防ぎます。 gotoを使用すると、このテクノロジが妨げられ、パフォーマンスが低下します。

コードを繰り返し実行すると、プログラムのバイナリサイズが大きくなります。したがって、すべての場合においてFinal()を繰り返すことは、あなたのコードのバイナリサイズを増やします。これは楽しいことではありません。