2010-04-13 2 views
2

Это в основном просто из любопытства, и это потенциально глупый вопрос. :)Более быстрый способ выполнения проверок аргументов метода

У меня есть метод, как это:

public void MyMethod(string arg1, string arg2, int arg3, string arg4, MyClass arg5) 
{ 
    // some magic here 
} 

Ни один из аргументов не может быть пустым, и ни один из строковых аргументов не может равняться String.Empty.

Вместо меня имеющий большой список:

if(arg1 == string.Empty || arg1 == null) 
{ 
    throw new ArgumentException("issue with arg1"); 
} 

есть более быстрый способ просто проверить все строковые аргументы?

Извинения, если мой вопрос непонятен.

Спасибо!

+0

Я имел взгляд немного, и я отправлю это как комментарий, как это на самом деле не ответ. В моей книге было бы замечательно, если бы мы могли определить «символ» для использования в аргументах в сигнатуре метода. Поэтому давайте предположим, что мы назначаем проверки не null, а не пустые для символа !, а затем в сигнатуре метода это может быть MyMethod (string! MyArg), C# делает автоматическую проверку и бросание исключений. Конечно, я могу сделать это сейчас с помощью метода, но если бы я мог назначить символ, который я мог бы использовать в сигнатуре, было бы гораздо быстрее напечатать! Мысли? – AndrewC

ответ

7

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

Также вы можете создавать различные полезные методы, такие как ThrowIfNullOrEmpty, которые будут инкапсулировать логику проверки аргументов.

+0

Спасибо! Взглянув в них! – AndrewC

3
if (string.IsNullOrEmpty(arg1)) 
{ 
    throw new ArgumentException("issue with arg1"); 
} 

Также есть code contracts в .NET 4.

4

Вы можете использовать String.IsNullOrEmpty:

if (String.IsNullOrEmpty(arg1)) 
    throw new ArgumentException("issue with arg1"); 

Если вы на Framework 4, есть также String.IsNullOrWhiteSpace метод (возможно, вы хотите бросить, если кто-то называет этот метод с строка, содержащая пробелов только).

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

С каркасом 4 у вас также есть CodeContracts - но синтаксис для его использования остается вызовом метода.

+1

Это круто, хотя мне интересно, был ли еще более быстрый способ. Мысли здесь громко, но было бы здорово, если бы была какая-то форма сокращенной нотации, которая могла бы быть добавлена ​​к аргументам в сигнатуре методов, так что C# будет автоматически генерировать исключение аргумента, если оно было пустым или пустым. – AndrewC

0

Ну, во-первых, вы можете использовать if (!String.IsNullOrEmpty(arg1)), чтобы уменьшить выражение if.

Во-вторых, вам нужна проверка аргументов в вашей сборке релизов, или было бы достаточно выполнить проверку arg в вашей сборке отладки? Это зависит от того, откуда поступают данные. Если эта функция вызывается вашим собственным кодом, и аргументы обрабатываются вашим кодом вызова, вероятно, достаточно проверить аргументы только в ваших сборках отладки. В этом случае используйте Debug.Assert(!String.IsNullOrEmpty(arg1), "msg"); и т. Д. Утверждения лишены версий релиза.

В-третьих, проверить DevLabs: Code Contracts

3

Реальная проблема здесь состоит в том, что ваш метод имеет слишком много аргументов. Это делает вас громоздким для написания кода проверки. Делает это громоздким по клиентскому коду. Подумайте о написании вспомогательного класса, в котором аргументы, которые вы сейчас проходите, являются свойствами. Теперь ваш метод может принимать только один аргумент. И проверка может быть выполнена в самом классе, а не в вашем методе.

Канонический пример этого шаблона в Framework является классом Process.Вспомогательный класс ProcessStartInfo позволяет использовать его.

3

Там хорошая библиотека называется CuttingEdge.Conditions, что обеспечивает свободно интерфейс для этого:

public void MyMethod(string arg1, string arg2, int arg3, string arg4, MyClass arg5) 
{ 
    Condition.Requires(arg1, "arg1").IsNotNull().IsNotEmpty().StartsWith("Foo"); 
} 

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

+0

+1, хорошая библиотека действительно – sll

-1

Насколько я мог понять ваш вопрос, как об этом:

static void Main(string[] args) 
{ 
    Test(null, "", "", ""); 
} 

static void Test(MyClass arg1, params string[] args) 
{ 
    if (args.Count(a => String.IsNullOrEmpty(a)) == args.Length) 
    { 
     throw new Exception("All params are null or empty"); 
    } 
} 
+1

Вы имеете в виду 'if (args.Any (a => a == null || (a - string &&! String.IsNullOrEmpty (a))) {throw new Exception (" No param can be null или empty. ")}'? – ANeves

+0

@sr pt: Спасибо! Отличный совет о 'Any()' – abatishchev

Смежные вопросы