Это дает тот же эффект, но вы правы дополнительные строки кода
Нет, это не так. Рассмотрим:
public void TransferMoney(Account from, Account to, decimal amount)
{
from.Debit(amount);
to.Credit(amount);
}
против
public void TransferMoney(Account from, Account to, decimal amount)
{
// Ideally do them separately
if (from == null || to == null)
{
throw new ArgumentNullException();
}
from.Debit(amount);
to.Credit(amount);
}
Обе сбои с исключениями - но первый сбоит , вызвав побочный эффект первым . Это плохо, и по возможности его следует избегать.
(Очевидно, в сценарии real это, предположительно, будет транзакционным, и не будет никакого реального вреда, но вы принимаете мою точку зрения.)
Кроме того, если один параметр используется в качестве аргумента для другого метода - или, что еще хуже, сохраняется для последующего использования - вы можете получить исключение, которое будет выброшено из полностью другого места, в некотором роде что может сделать это полностью неочевидным, какова была первоначальная проблема.
Обычно я проверяю нулевые параметры только на не приватных методах, но оставляю приватные методы для выдачи исключения NullReferenceException.
Это кажется довольно разумной политикой. Если из какого-то волосатого кода вызывается приватный / внутренний метод, и я обеспокоен тем, что мог что-то испортить, я иногда проверяю его даже тогда.