Более Хороший способ проверки параметра?

Мы используем.NET 2,0 платформы с C# 3.0 (я думаю, что это - последняя версия C#, который может работать на 2,0 версиях платформы, исправить меня, если я неправ).

Там что-то встроено в C#, который может сделать этот тип из проверки параметра более удобным?

public ConnectionSettings(string url, string username, string password,
                          bool checkPermissions)
{
    if (username == null) {
        throw new ArgumentNullException("username");
    }

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

    if (String.IsNullOrEmpty(url)) {
        throw new ArgumentException("Must not be null or empty, it was " +
            (url == null ? url : "empty"), "url");
    }

    this.url = url;
    this.username = username;
    this.password = password;
    this.checkPermissions = checkPermissions;
}

Такая проверка параметра становится общим шаблоном и приводит к большому количеству из "почти шаблона" код для прохождения через в наших открытых методах.

Если нет ничего, встроил. Есть ли какие-либо большие свободные библиотеки, которыми мы могли пользоваться?

8
задан Daniel Daranas 14 December 2011 в 22:45
поделиться

7 ответов

Обычно я создаю статические вспомогательные методы...

Например,

public static void CheckNotNull(object value, string parameterName)
{
   if(value == null) { throw new ArgumentNullException(parameterName); }
}

Это означает, что вы можете сократить свой код до чего-то похожего на нижеприведенный и просто сделать его немного аккуратнее.

CheckNotNull(username, "username");
CheckNotNull(password, "password"); 

Или вы можете обернуть его как метод расширения:

public static void CheckNotNull<T>(this T value, string parameterName)
{
   if(value == null) { throw new ArgumentNullException(parameterName); }
}

И использовать как:

username.CheckNotNull("username");
password.CheckNotNull("password");

А если вы чувствуете себя действительно фантастически, вы могли бы опросить имена параметров, используя отражение. Отражение довольно медленное, так что вы будете делать это, только если собираетесь выбросить исключение, но это избавит вас от необходимости постоянно вводить буквальное имя параметра.

4
ответ дан 5 December 2019 в 09:23
поделиться

Похожая идея с беглой валидацией параметров, как упомянул Giorgi, но здесь избегается избыточное именование параметра, а также строки, которые не могут быть автоматически обновлены инструментами рефакторинга кода.

http://charlieflowers.wordpress.com/tag/parameter-validation/

2
ответ дан 5 December 2019 в 09:23
поделиться

Вы можете использовать il weaver, например Post Sharp , имейте в виду, что компилятор как служба в C # 5 сделает такие вещи встроенными.

Лично Я бы не рекомендовал этот подход, если проблема не является серьезной и ее нужно решать. Обычно рекомендуется использовать несколько утверждений и проверку предварительных условий, как вы описали выше.

EG:

public ConnectionSettings(
   [NotNullOrEmpty] string url, 
   [NotNull] string username, 
   [NotNull] string password,
   bool checkPermissions)
{
    this.url = url;
    this.username = username;
    this.password = password;
    this.checkPermissions = checkPermissions;
}

Вы также можете интегрировать такие вещи с контрактами кода , которые позволят вам выполнять некоторый обширный статический анализ.

4
ответ дан 5 December 2019 в 09:23
поделиться

Вот хороший быстрый способ сделать это.

Какие ваши любимые методы расширения для C #? (codeplex.com/extensionoverflow)

public static class Extensions
{
        public static void ThrowIfArgumentIsNull<T>(this T obj, string parameterName) where T : class
        {
                if (obj == null) throw new ArgumentNullException(parameterName + " not allowed to be null");
        }
}

internal class Test
{
        public Test(string input1)
        {
                input1.ThrowIfArgumentIsNull("input1");
        }
}
3
ответ дан 5 December 2019 в 09:23
поделиться

Вы можете сделать это с помощью контрактов, но это та же концепция.

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

2
ответ дан 5 December 2019 в 09:23
поделиться

Он не встроен в .Net Framework, но вы можете использовать Fluent Argument Validation

2
ответ дан 5 December 2019 в 09:23
поделиться

Чтобы добавить к ответу Сэма выше, вот ссылка, в которой рассказывается, как можно реализовать такие атрибуты с помощью PostSharp:

http://dpatrickcaldwell.blogspot.com/2009/03/validate-parameters-using-attributes. html

1
ответ дан 5 December 2019 в 09:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: