Более быстрый способ проверки аргументов метода - PullRequest
2 голосов
/ 13 апреля 2010

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

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

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");
}

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

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

Спасибо!

Ответы [ 7 ]

7 голосов
/ 13 апреля 2010

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

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

4 голосов
/ 13 апреля 2010

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

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

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

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

В фреймворке 4 у вас также есть Код Контракты , но синтаксис для его использования остается вызовом метода.

3 голосов
/ 13 апреля 2010

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

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

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

3 голосов
/ 13 апреля 2010

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

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

3 голосов
/ 13 апреля 2010
if (string.IsNullOrEmpty(arg1))
{
    throw new ArgumentException("issue with arg1");
}

Также есть кодовые контракты в .NET 4.

0 голосов
/ 13 апреля 2010

Насколько я мог понять твой вопрос, как на счет этого:

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");
    }
}
0 голосов
/ 13 апреля 2010

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

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

В-третьих, проверить DevLabs: кодовые контракты

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