Теоретично, блок try / catch не матиме впливу на поведінку коду, якщо насправді не відбудеться виняток. Однак є деякі рідкісні обставини, коли існування блоку спробу / лову може мати головний ефект, а також деякі нечасті, але навряд чи незрозумілі, де ефект може бути помітний. Причиною цього є той код, як:
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
компілятор може бути в змозі оптимізувати оператор1 виходячи з того, що оператор statement2 буде гарантовано виконаний перед оператором3. Якщо компілятор може розпізнати, що thing1 не має побічних ефектів, а thing2 насправді не використовує x, він може спокійно опустити речі1. Якщо [як у цьому випадку] речі1 були дорогими, це могло б стати головною оптимізацією, хоча випадки, коли thing1 коштує, також є тими, які компілятор, найменше, може оптимізувати. Припустимо, код було змінено:
x=thing1(); // statement1
try
{ x=thing2(x); } // statement2
catch { q(); }
doSomething(x); // statement3
Тепер існує послідовність подій, де оператор3 може виконуватись без виконання2. Навіть якщо нічого в коді для thing2
не може викинути виняток, можливо, інший потік міг би скористатися Interlocked.CompareExchange
сповіщенням, яке q
було очищено, і встановити його Thread.ResetAbort
, а потім виконати команду a, Thread.Abort()
перш ніж statement2 записав її значення x
. Тоді команда the catch
Execute Thread.ResetAbort()
[через делегата q
] дозволить виконувати виконання з оператором3. Така послідовність подій, звичайно, була б надзвичайно малоймовірною, але компілятор необхідний для створення коду, який працює відповідно до специфікацій, навіть коли трапляються такі неймовірні події.
Взагалі, компілятор набагато частіше помічає можливості залишити прості біти коду, ніж складні, і тому рідкість, коли спробу / улов може значно вплинути на продуктивність, якщо винятки ніколи не викидаються. Тим не менш, є деякі ситуації, коли існування блоку спробу / лову може завадити оптимізації, які - але для try / catch - дозволили б коду працювати швидше.