Как лучше всего проверить параметры метода? - PullRequest
8 голосов
/ 31 марта 2012

Я знаю два способа проверить параметры метода и генерировать исключения, когда это необходимо.

1) Проверять каждый параметр по одному и выдавать исключение, когда оно неверно:

public void Method(object parameter1, object parameter2)
{
    if (parameter1 == null)
    {
        throw new ArgumentNullException("parameter1");
    }

    if (parameter2 == null)
    {
        throw new ArgumentNullException("parameter2");
    }

    ...
}

2) Проверьте все параметры сразу и сгенерируйте одно и то же исключение для всех:

public void Method(object parameter1, object parameter2)
{
    if (parameter1 == null || parameter2 == null)
    {
        throw new ArgumentNullException();
    }

    ...
}

Первый подход, на мой взгляд, лучше и чище, но также охватывает много строк.Например, метод, который фактически выполняет 2 строки кода - таким образом, код будет увеличиваться на 4 строки (включая пустую строку) для каждого параметра.

Меня интересует подход, используемый опытными программистами.Есть ли лучшие способы, чем эти два?

Ответы [ 7 ]

21 голосов
/ 31 марта 2012

Если вы используете .NET Framework 4, посмотрите Кодовые контракты , что упрощает его до одной строки кода

public string Reverse(string text)
{
   Contract.Requires<ArgumentNullException>(text!=null, "ParAmeter cannot be null.");

   .....
}

Причина, по которой вы будете использовать это, заключается в том, чтотеперь вы можете получить автоматизированные инструменты, такие как Pex , чтобы сообщить вам, какие юнит-тесты применить к этому методу.Он также дает вам обратную связь во время компиляции, если этот метод будет генерировать исключение, основанное на том, как вы его вызываете.Например,

String text = null;
String reversedString = Reverse(text);

Компилятор предупредит вас, что это вызовет исключение.

Примечание. Code Contracts необходимо установить надстройку, но она бесплатна.

5 голосов
/ 31 марта 2012

Используйте атрибут метода для чистой проверки ваших параметров. мне написали каркас для проверки параметров в python. наилучшая практика c # здесь

4 голосов
/ 31 марта 2012

Подход 1 значительно более полезен на мой взгляд.NullReferenceException с, или в этом случае ArgumentNullException с, когда вы не можете определить, что было null очень расстраивает.

Кроме того, если вам не нравится смотреть код проверки, вы можетевсегда переносите его в область кода и складывайте в IDE.

3 голосов
/ 07 ноября 2014

я знаю, что это старая ветка, но я хотел бы поделиться MHO.это то, что я обычно делаю:

создайте общий метод:

private void ValidateArgument<exType>(Func<bool> validation, string errorMessage) where exType : Exception
        {
            if (validation())
            {
                throw Activator.CreateInstance(typeof(exType), errorMessage) as exType;
            }
        }

и затем из вызывающего метода, который вы делаете:

this.ValidateArgument<ArgumentException>(() => string.IsNullOrEmpty(firstname), "firstname must be supplied");
0 голосов
/ 31 марта 2012

Любой подход в порядке. По сути, бросить ArgumentNullException - это то, что нужно делать здесь.

как документация для него сказано

исключение, которое выдается, когда пустая ссылка (Ничего в Visual Basic) передается методу, который не принимает его в качестве допустимого аргумента.

0 голосов
/ 31 марта 2012

Лично я обычно использую методы, которые проверяют или проверяют код и возвращают false, когда они терпят неудачу (и, возможно, регистрируют / отображают ошибку).

Мне нравится проверять все проблемы и проверять их все, поэтому с помощью || в основном остановится на первом тесте.

0 голосов
/ 31 марта 2012

Это зависит от того, что на самом деле требуется.

  1. Если вам нужно выдать разные исключения для обоих нулевых значений, то вам следует перейти на первый подход.

  2. Если оба нулевых случая одинаковы для вашего кода, тогда второй подход будет более удобочитаемым.

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