Về lý thuyết, khối try / Catch sẽ không ảnh hưởng đến hành vi mã trừ khi có ngoại lệ thực sự xảy ra. Tuy nhiên, có một số trường hợp hiếm hoi, trong đó sự tồn tại của khối thử / bắt có thể có ảnh hưởng lớn và một số trường hợp không phổ biến nhưng hầu như không bị che khuất trong đó hiệu ứng có thể thấy rõ. Lý do cho điều này là mã đã cho như:
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
trình biên dịch có thể tối ưu hóa statement1 dựa trên thực tế là statement2 được đảm bảo thực thi trước statement3. Nếu trình biên dịch có thể nhận ra rằng thing1 không có tác dụng phụ và thing2 không thực sự sử dụng x, thì nó hoàn toàn có thể bỏ qua điều1. Nếu [như trong trường hợp này] điều1 là đắt tiền, đó có thể là một tối ưu hóa lớn, mặc dù các trường hợp điều1 đắt tiền cũng là những trình biên dịch sẽ ít có khả năng tối ưu hóa nhất. Giả sử mã đã được thay đổi:
x=thing1(); // statement1
try
{ x=thing2(x); } // statement2
catch { q(); }
doSomething(x); // statement3
Bây giờ tồn tại một chuỗi các sự kiện trong đó statement3 có thể thực thi mà không có statement2 đã thực thi. Ngay cả khi không có gì trong mã thing2
có thể đưa ra một ngoại lệ, thì có thể là một luồng khác có thể sử dụng một Interlocked.CompareExchange
thông báo q
đã bị xóa và đặt nó thành Thread.ResetAbort
, sau đó thực hiện một Thread.Abort()
câu lệnh trước khi ghi giá trị của nó x
. Sau đó, catch
lệnh thực thi Thread.ResetAbort()
[thông qua ủy nhiệm q
], cho phép thực thi tiếp tục với statement3. Một chuỗi các sự kiện như vậy tất nhiên sẽ không thể thực hiện được, nhưng một trình biên dịch được yêu cầu để tạo mã hoạt động theo đặc tả ngay cả khi các sự kiện không thể xảy ra như vậy xảy ra.
Nhìn chung, trình biên dịch có nhiều khả năng nhận thấy các cơ hội để loại bỏ các đoạn mã đơn giản hơn các mã phức tạp, và do đó, rất hiếm khi một lần thử / bắt có thể ảnh hưởng đến hiệu năng nhiều nếu không bao giờ có ngoại lệ. Tuy nhiên, có một số tình huống trong đó sự tồn tại của khối thử / bắt có thể ngăn chặn tối ưu hóa - nhưng đối với thử / bắt - sẽ cho phép mã chạy nhanh hơn.