Нулевой тест или попытка поймать
У кого-нибудь есть метрики выполнения нулевого теста по сравнению с переносом кода в попытку?
Я подозреваю, что нулевой тест намного эффективнее, но у меня нет никаких эмпирических данных.
Среда - C#/.NET 3.x и сравнение кода:
Dude x = (Dude)Session["xxxx"];
x = x== null ? new Dude(): x;
против
Dude x = null;
try {
x = (Dude)Session["xxxx"];
x.something();
} catch {
x = new Dude();
}
Есть ли какие-либо преимущества для упаковки в try catch?
11 ответов
Если ноль является возможным ожидаемым значением, тогда проверьте ноль. Если вам не нравится нулевой тест и у вас есть значение по умолчанию, вы можете использовать оператор нулевого коэффициента, чтобы установить значение по умолчанию:
// value is (Dude)Session["xxxx"] if not null, otherwise it's a new object.
Dude x = (Dude)Session["xxxx"] ?? new Dude();
Сохраните try/catch для исключений (действительно неожиданных событий).
Если компактный код - это то, что вы действительно ищете, вы можете:
Dude x = Session["xxxx"] as Dude ?? new Dude();
??
Оператор вернет первое ненулевое значение двух значений, если оно есть.
Спасибо
Я думаю, что это будет самый быстрый маршрут:
Dude x = (Dude)Session["xxxx"] ?? new Dude();
?? Оператор является ярлыком для проверки нуля, когда вы хотите присвоить определенное значение, если оно равно нулю.
В любом случае исключения приводят не только к созданию нового объекта, но и к генерации трассировки стека, что замедляет работу.
Исключения требуют дополнительной памяти, а также времени, чтобы поймать. ВСЕГДА лучше проверять на ноль, если это возможное значение.
Еще одна вещь, которую стоит учесть, это просто меньше кода и удобнее читать нулевой тест. Обычно наличие блоков try / catch обычно не добавляет накладных расходов к вашему коду для обычного случая, но когда срабатывает исключение, это довольно дорого.
Поскольку вы хотите проверить только на ноль, это то, что вы должны сделать. Это эффективнее, чем ловить исключение.
Кроме того, вылавливая исключения, вы должны быть очень конкретными и поймать только то, что вы ожидаете. Если вы обнаружите какое-либо исключение, вы рискуете обнаружить ошибки, которые не ожидали, и неправильно их обработать.
Исключение должно работать нормально в этом случае, но я считаю, что номер 1 - лучший путь. Исключение не следует использовать в качестве оператора If/else, исключение выдает ошибку, которая занимает больше системных ресурсов, чем при первом сравнении.
Используйте исключения для исключительных случаев - не обычный программный поток.
Если вам нужно выполнить много проверок на нуль, рассмотрите возможность использования шаблона нулевого объекта вместо использования реальных нулей, чтобы указать несуществующее значение, которое, возможно, имеет поведение по умолчанию.
Я всегда немного подозревал шаблон Null Object, пока не начал использовать Objective-C, где это встроенное поведение. Это действительно очищает много кода (но это, конечно, не всегда уместно).
Я согласен с @Justin Niessner. Кроме того, вы можете прочитать эту статью, которая раскрывает некоторые интересные моменты.
Вы никогда не должны использовать try/catch в обычном пути кода вашей программы. Если вы это сделаете, вы создадите постоянный мусор, который сборщик мусора должен будет обработать. Гораздо лучше просто проверить на ноль.
НИКОГДА не используйте исключения для потока управления программой. Единственный раз, когда вы захотите создать исключение, это если (Dude)Session["xxxx"];
Нулевое значение было причиной, чтобы прекратить функционирование метода, в котором вы были. То есть, если нулевое значение там помешало бы этому методу успешно выполнить функцию, которую он был вызван для выполнения. Когда вы писали вопрос, если все, что вам нужно сделать в этом случае, чтобы продолжить, это создать новый Dude(), то это не так, поэтому исключение не является оправданным.