更快地执行方法参数检查的方法

时间:2010-04-13 17:02:59

标签: c# arguments exception

这主要是出于好奇,而且可能是一个愚蠢的问题。 :)

我有这样的方法:

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

所有参数都不能为null,并且所有字符串参数都不能等于String.Empty

而不是我有一个大清单:

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

有没有更简单的方法来检查所有字符串参数?

如果我的问题不明确,请道歉。

谢谢!

7 个答案:

答案 0 :(得分:7)

您可以创建或使用框架来检查方法的合同,例如Code Contracts

您还可以创建各种实用程序方法,例如ThrowIfNullOrEmpty,它们将封装检查参数的逻辑。

答案 1 :(得分:4)

您可以使用String.IsNullOrEmpty:

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

如果您使用的是Framework 4,那么还有一个String.IsNullOrWhiteSpace方法(如果有人使用仅包含空格的字符串调用该方法,也许您也想抛出这种方法。)

您可以使用实用程序方法来检查参数并抛出,但这是您将获得的最短符号。 C#中没有允许您向编译器表达的语法,这些空值是不可接受的,并且语言会为您抛出异常。

使用框架4,您还有Code Contracts - 但使用它的语法仍然是方法调用。

答案 2 :(得分:3)

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

.NET 4中也有code contracts

答案 3 :(得分:3)

这里真正的问题是你的方法有太多的参数。这使您编写验证代码变得笨拙。在客户端代码上也使它变得笨拙。考虑编写一个辅助类,其中您现在传递的参数是属性。您的方法现在只能使用一个参数。验证可以在类本身而不是您的方法中完成。

Framework中此模式的规范示例是Process类。 ProcessStartInfo助手类使其可用。

答案 4 :(得分: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)等等......如果你有多个参数检查,它可以大大缩短和简化验证,最重要的是,在整个应用程序中使参数检查和异常保持一致。

答案 5 :(得分:0)

首先,您可以使用if (!String.IsNullOrEmpty(arg1))来减少if表达式。

其次,您是否需要在发布版本中进行参数检查,或者在调试版本中执行arg检查是否足够?这取决于数据的来源。如果您的代码调用此函数并且您的调用代码处理了args,那么仅检查调试版本中的args就足够了。在这种情况下,请使用Debug.Assert(!String.IsNullOrEmpty(arg1), "msg");等。断言将从发布版本中删除。

第三,查看DevLabs: Code Contracts

答案 6 :(得分:-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");
    }
}