这主要是出于好奇,而且可能是一个愚蠢的问题。 :)
我有这样的方法:
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");
}
有没有更简单的方法来检查所有字符串参数?
如果我的问题不明确,请道歉。
谢谢!
答案 0 :(得分:7)
您可以创建或使用框架来检查方法的合同,例如Code Contracts
您还可以创建各种实用程序方法,例如ThrowIfNullOrEmpty
,它们将封装检查参数的逻辑。
答案 1 :(得分:4)
您可以使用String.IsNullOrEmpty:
if (String.IsNullOrEmpty(arg1) )
throw new ArgumentException("issue with arg1");
如果您使用的是Framework 4,那么还有一个String.IsNullOrWhiteSpace方法(如果有人使用仅包含空格的字符串调用该方法,也许您也想抛出这种方法。)
您可以使用实用程序方法来检查参数并抛出,但这是您将获得的最短符号。 C#中没有允许您向编译器表达的语法,这些空值是不可接受的,并且语言会为您抛出异常。
答案 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");
等。断言将从发布版本中删除。
答案 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");
}
}