Производительность здесь не самая важная проблема.Вопрос в том, какая из этих двух программ станет более читабельной / поддерживаемой / тестируемой.Вы можете беспокоиться о производительности позже.
В общем, не используйте исключения для управления потоком.Они фактически являются нелокальными goto
, что делает программы более трудными для чтения и отслеживания.Как таковые, они должны быть зарезервированы для исключительных ситуаций.Если вы можете избежать использования блока try-catch
для управления потоком, не делайте этого.Ваши программы будут более читабельными и обслуживаемыми.
«Правильный» способ справиться с этой ситуацией:
var list = someMethod();
if(list == null || list.Length == 0) {
// handle something bad
}
string a = list[0];
if(a != null) {
// go
}
Вы можете избежать проверки того, что list
не является нулевым и не пустым, еслисуществует контракт (Contract.Ensures
), который гарантирует, что возвращаемое значение из someMethod
не является нулевым и не пустым.
Правда, однако, исключения являются локально дорогими.Будут ли они влиять на производительность вашей программы (т.е. являются узким местом) - это совсем другой вопрос.Но при правильном использовании исключения, как правило, не являются узким местом (кто заботится о производительности в случае сбоя приложения?)