Лучший способ проверить параметры функции: проверить на ноль или попробовать / поймать - PullRequest
7 голосов
/ 21 октября 2010

При реализации / использовании методов, которые возвращают или работают с экземплярами объектов, какой самый элегантный подход для проверки параметров функции?

Способ вызова:

someType GetSomething(object x)
{
    if (x == null) {
        return;
    }

    //
    // Code...
    //
}

или лучше:

someType GetSomething(object x)
{
    if (x == null) {
        throw new ArgumentNullException("x");
    }

    //
    // Code...
    //
}

Способ вызова:

void SomeOtherMethod()
{
    someType myType = GetSomething(someObject);

    if (someType == null) {
        return;
    }

}

или лучше:

void SomeOtherMethod()
{
    try {
        someType myType = GetSomething(someObject);
    } catch (ArgumentNullException) {
    }
}

При просмотре похожих вопросов причина не использовать try / catch - производительность. Но ИМХО трик-трюк выглядит лучше:).

Итак, какой путь более "изящен"?

Ответы [ 4 ]

9 голосов
/ 21 октября 2010

Если передача в null недопустима, сгенерировать исключение (то есть - это исключительная ситуация, которая должна никогда не произойти).

Если параметр null является допустимым, возвращает соответствующий объект.

В целом, принятие null параметров плохая практика - это идет вразрез с принципом наименьшего удивления и требует от вызывающего знаю это действительно.

4 голосов
/ 21 октября 2010

Что касается элегантности, то трудно превысить Кодовые контракты .

Contract.Requires(x != null);
2 голосов
/ 21 октября 2010

Вы должны использовать исключения только в исключительных случаях.Если вы ожидаете, что аргумент может быть (законно) нулевым, вы должны проверить его - не используйте исключения для этого.IMO, вы должны проверить на null на вызывающем сайте ( до вызова), если нет смысла передавать null вашему методу.

0 голосов
/ 21 октября 2010

В вашем примере GetSomthing является приватным. Это означает, что вы можете отследить всех вызывающих и убедиться, что значения Null не передаются, например, в.

 if (x != null)
   someType myType = GetSomthing(x)
 else
   // Initialize  x or throw an InvalidOperation or return whatever is correct

Однако, если это не совсем личное, то вам следует поступить так, как сказал Одед и другие. Проверьте, имеет ли оно значение null, и в большинстве случаев выдает ArguementExecption.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...