Theoretisch hat ein Try / Catch-Block keine Auswirkung auf das Codeverhalten, es sei denn, es tritt tatsächlich eine Ausnahme auf. Es gibt jedoch einige seltene Umstände, in denen das Vorhandensein eines Try / Catch-Blocks einen großen Effekt haben kann, und einige ungewöhnliche, aber kaum undurchsichtige, in denen der Effekt spürbar sein kann. Der Grund dafür ist der gegebene Code wie:
Action q;
double thing1()
{ double total; for (int i=0; i<1000000; i++) total+=1.0/i; return total;}
double thing2()
{ q=null; return 1.0;}
...
x=thing1(); // statement1
x=thing2(x); // statement2
doSomething(x); // statement3
Der Compiler kann möglicherweise Anweisung1 basierend auf der Tatsache optimieren, dass die Ausführung von Anweisung2 vor Anweisung3 garantiert ist. Wenn der Compiler erkennt, dass thing1 keine Nebenwirkungen hat und thing2 x nicht verwendet, kann er thing1 sicher ganz weglassen. Wenn [wie in diesem Fall] thing1 teuer wäre, könnte dies eine wesentliche Optimierung sein, obwohl die Fälle, in denen thing1 teuer ist, auch diejenigen sind, die der Compiler am wenigsten optimieren würde. Angenommen, der Code wurde geändert:
x=thing1(); // statement1
try
{ x=thing2(x); } // statement2
catch { q(); }
doSomething(x); // statement3
Jetzt gibt es eine Folge von Ereignissen, bei denen Anweisung3 ausgeführt werden könnte, ohne dass Anweisung2 ausgeführt wurde. Selbst wenn nichts im Code für thing2
eine Ausnahme Interlocked.CompareExchange
auslösen könnte, könnte ein anderer Thread eine verwenden, um zu bemerken, dass q
gelöscht und auf gesetzt wurde Thread.ResetAbort
, und dann eine Thread.Abort()
Voranweisung ausführen, in die Anweisung2 ihren Wert geschrieben hat x
. Dann catch
würde das Thread.ResetAbort()
[über einen Delegaten q
] ausgeführt, so dass die Ausführung mit Anweisung3 fortgesetzt werden kann. Eine solche Abfolge von Ereignissen wäre natürlich außerordentlich unwahrscheinlich, aber ein Compiler muss Code generieren, der gemäß der Spezifikation funktioniert, selbst wenn solche unwahrscheinlichen Ereignisse auftreten.
Im Allgemeinen ist es viel wahrscheinlicher, dass der Compiler Möglichkeiten bemerkt, einfache Codebits wegzulassen als komplexe, und daher ist es selten, dass ein Versuch / Fang die Leistung stark beeinträchtigt, wenn niemals Ausnahmen ausgelöst werden. Es gibt jedoch einige Situationen, in denen das Vorhandensein eines Try / Catch-Blocks Optimierungen verhindern kann, die - ohne Try / Catch - eine schnellere Ausführung des Codes ermöglicht hätten.