Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:参数验证:空/空字符串_C#_String_Argument Validation - Fatal编程技术网

C#:参数验证:空/空字符串

C#:参数验证:空/空字符串,c#,string,argument-validation,C#,String,Argument Validation,我不知道有多少次我不得不编写代码来验证字符串参数: public RoomName(string name) { if (string.IsNullOrEmpty(name)) { throw new ArgumentException("Cannot be empty", "name"); } } 有没有办法避免这种情况?是否存在某种属性或契约设计机制来避免这种情况?难道没有办法说: public RoomName(NotNullOrEmptyStri

我不知道有多少次我不得不编写代码来验证字符串参数:

public RoomName(string name)
{
    if (string.IsNullOrEmpty(name))
    {
        throw new ArgumentException("Cannot be empty", "name");
    }
}
有没有办法避免这种情况?是否存在某种属性或契约设计机制来避免这种情况?难道没有办法说:

public RoomName(NotNullOrEmptyString name)
{

无需实际创建该类型?

另请参阅,以获取有关代码契约的更多信息,了解如何在VS2008中实现它们,以及如何将它们集成到VS2010中。

您可以通过带有属性的代码注入来实现这一点

另一个节省一些编码时间,但仍能给您很多控制的方法是使用以下内容。这为参数检查提供了一个流畅的界面,因此您可以编写:

name.Requires().IsNotNull();

虽然这个问题不久前已经得到了回答,但我最近一直在思考同样的问题。形式化的代码契约(带有自动验证或检查)似乎是一个好主意,但一般来说,它们的验证能力非常有限,对于空字符串或空字符串检查这样的简单检查,它们需要的代码与老式检查一样多(或更多)

具有讽刺意味的是,在我看来,字符串案例的最佳答案确实是一个或两个类,它们包装一个已检查为非null、空或空白的字符串,并传递此实例:

public class NonEmptyString : IComparable<NonEmptyString>, ...
{
    private readonly string _value;

    public NonEmptyString(string value)
    {
        if (value == null)
        {
            throw new ArgumentNullException("value");
        }
        if (value.Length == 0)
        {                
            throw NewStringIsEmptyException("value");
        }
        _value = value;
    }

    public string Value
    {
        get { return _value; }
    }

    ...
}

public class NonWhiteSpaceString : NonEmptyString
{
    ....
}
公共类非空字符串:IComparable。。。
{
私有只读字符串_值;
公共非空字符串(字符串值)
{
如果(值==null)
{
抛出新的ArgumentNullException(“值”);
}
如果(value.Length==0)
{                
抛出NewStringIsEmptyException(“值”);
}
_价值=价值;
}
公共字符串值
{
获取{返回_值;}
}
...
}
公共类非空白字符串:非空白字符串
{
....
}
当然,传递这些实例并不能阻止您检查它们本身是否为null,但它有一些很大的优势:

  • 您不必反复检查空字符串或空白字符串,这在字符串大量传递的情况下很容易出错
  • 正如我在实现中所做的那样,检查null与检查空值(或空白值)有所不同,因为您希望在前一种情况下抛出特定的ArgumentNullException,在第二种情况下抛出一些ArgumentException
  • 它清楚地表明了对字符串值的约束,就像任何包装类应该做的那样。事实上,如果您有一个具有任何约束的字符串,并且它被大量传递,我总是建议将它封装在一个类中,该类封装了检查,并避免了代码的其余部分出现问题。一个很好的例子是必须满足某个正则表达式的字符串。然而,我要转移话题了

我认为您需要在解决方案中添加一些参数名称跟踪。这是因为如果您使用
frob(null,“a值”)
调用
frob(string foo,string bar)
,并收到错误消息
System.ArgumentNullException:值不能为null,大多数人都会发现这很混乱。参数名称:value
而不是
System.ArgumentNullException:值不能为null。参数名称:foo
您可能会发现此链接非常有用