2010-04-13 103 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

我有一个看起来有点,我会张贴此作为评论的是不是一个真正的答案。在我的书中,如果我们能够在方法签名中定义一个用于参数的“符号”,那将是非常好的。因此,可以说我们将符号不为空的检查分配给符号!,然后在方法签名中它可以是MyMethod(string!myArg),用c#执行自动检查和抛出异常。当然,我现在可以用一种方法来做到这一点,但是如果我可以分配一个符号,我可以在签名中使用它,这将更快地输出!思考? – AndrewC 2010-04-13 19:53:30

回答

7

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

此外,您可以创建各种实用方法,如ThrowIfNullOrEmpty谁将封装检查参数的逻辑。

+0

谢谢!看着这些! – AndrewC 2010-04-13 17:11:59

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#将自动抛出一个参数异常(如果它为null或空),那将会很棒。 – AndrewC 2010-04-13 17:07:38

0

那么首先,你可以使用if (!String.IsNullOrEmpty(arg1))来减少if表达式。其次,你是否需要在你的发布版本中进行参数检查,还是只需要在你的调试版本中执行arg检查就足够了?这取决于数据来自何处。如果你的代码调用了这个函数,并且你的调用代码处理了这些参数,那么只需要在你的调试版本中检查参数就足够了。在这种情况下,请使用Debug.Assert(!String.IsNullOrEmpty(arg1), "msg");等。断言将从发布版本中删除。

三,检查出DevLabs: Code Contracts

3

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

框架中此模式的规范示例是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"); 
} 

它提供了各种验证,其中包括null检查类型安全的条件下,对数字的范围检查,字符串检查(包括StartsWith)等等......如果你有多个参数检查,它可以大大缩短和简化你的验证,最重要的是,使参数检查和异常在整个应用程序中保持一致。

+0

+1,很好的库确实 – sll 2011-11-05 13:00:06

-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.IsNullOrEmpty(a))){throw new Exception(“No param can “)}'? – ANeves 2010-04-13 17:25:22

+0

@sr pt:谢谢! – abatishchev 2010-04-13 18:11:40