void MyMethod() {
...
//throw new ArgumentNullException("paramName");
ThrowArgumentNullException("paramName");
...
}
void ThrowArgumentNullException(string paramName) {
throw new ArgumentNullException(paramName);
}
Я читал, что вызывается метод ThrowHelper (метод, единственной целью которого является создание исключения) вместо непосредственного вызова должен давать меньший байт-код.
Это, а также очевидная инкапсуляция (еще один уровень косвенности) могут быть вескими причинами не выполнять прямой вызов, по крайней мере, в некоторых сценариях.
В любом случае, по моему мнению, недостатки тоже не являются несущественными.
- Часть (исключительного) потока управления скрыта
- Исключения в конечном итоге имеют более загадочную трассировку стека
- компилятор (2.0) не распознает, что вызовы ThrowHelper являются точками выхода из метода, поэтому требуется некоторый обход кода необходимо.
int MyMethod(int i) {
switch (i) {
case 1:
return 1;
default:
ThrowMyException();
}
return 0; // Unreachable (but needed) code
}
Отчасти это может быть вопросом личного вкуса. В любом случае, каковы ваши личные рекомендации по этому вопросу? Считаете ли вы хорошей идеей использовать ThrowHelpers для всех таких распространенных задач, как проверка параметров метода (ThrowArgumentNullException(paramName) и тому подобное)?
Я пропустил что-то очевидное по этой проблеме?
Кстати, я стараюсь не смешивать эту проблему с проблемой проверки, например. такой метод:
ThrowIfNameIsNullOrEmpty(name);
Подробнее здесь: https://stackoverflow.com/questions/198 ... g-directly