Hiệu suất không phải là mối quan tâm có liên quan nhất ở đây. Câu hỏi đặt ra là, câu hỏi nào trong hai câu hỏi này dẫn đến các chương trình có thể đọc/duy trì/kiểm tra dễ đọc hơn. Bạn có thể lo lắng về hiệu suất sau này.
Nói chung, không sử dụng ngoại lệ cho điều khiển luồng. Chúng có hiệu quả là một địa phương không phải là địa phương goto
mà làm cho chương trình khó đọc và làm theo. Như vậy, họ nên được dành riêng cho các tình huống đặc biệt. Nếu bạn không thể sử dụng khối try-catch
để kiểm soát luồng, thì đừng. Các chương trình của bạn sẽ dễ đọc hơn và dễ bảo trì hơn.
Các "đúng" cách để xử lý tình trạng này là
var list = someMethod();
if(list == null || list.Length == 0) {
// handle something bad
}
string a = list[0];
if(a != null) {
// go
}
Bạn có thể tránh việc kiểm tra rằng list
không phải là null và không có sản phẩm nào nếu có một hợp đồng (Contract.Ensures
) mà đảm bảo giá trị trả về từ someMethod
là không rỗng và không rỗng.
Đó là sự thật, tuy nhiên, trường hợp ngoại lệ là đắt tiền tại địa phương. Cho dù chúng có ảnh hưởng đến hiệu suất chương trình của bạn hay không (tức là, là một nút cổ chai) là một câu hỏi khác hoàn toàn. Nhưng được sử dụng đúng cách, ngoại lệ nói chung không phải là một nút cổ chai (ai quan tâm đến hiệu suất khi ứng dụng của bạn bị rơi?)
Hủy từ "nhanh hơn", nó không liên quan. Và đó thậm chí không phải là cách thích hợp để sử dụng try-catch vì bạn sắp xếp trolling CLR. – BoltClock
chỉ là một ví dụ ... – carlosdubusm
@BoltClock, không có không. Nếu trường hợp ngoại lệ xảy ra. Nó chậm hơn. – CaffGeek