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

时间:2009-07-10 00:44:33

标签: c# string argument-validation

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

public RoomName(string name)
{
    if (string.IsNullOrEmpty(name))
    {
        throw new ArgumentException("Cannot be empty", "name");
    }
}

无论如何要避免这种情况吗?是否有一些属性或设计合同机制来避免这种情况?没有办法说出来:

public RoomName(NotNullOrEmptyString name)
{

无需实际创建该类型?

3 个答案:

答案 0 :(得分:7)

您可以通过代码注入属性来实现。

保存一些编码时间但仍然给你很多控制权的另一个选择是使用CuttingEdge.Conditions之类的东西。这为参数检查提供了流畅的接口,因此您可以编写:

name.Requires().IsNotNull();

答案 1 :(得分:1)

虽然问题已经回答了一段时间,但我最近一直在考虑同样的问题。形式化代码合同(带有自动验证或检查)似乎是一个好主意,但通常,它们的验证功能非常有限,对于像空字符串或空字符串检查这样的简单检查,它们需要的代码(或更多) )而不是老式的支票。

具有讽刺意味的是,我认为对于字符串大小写的最佳答案实际上是一个或两个类,它们包含一个已经被检查过的字符串,不是空,空或空格,并传递这个实例:

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
{
    ....
}

当然,绕过这些实例并不能阻止你自己检查它们是否为空,但它有一些很大的优点:

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

答案 2 :(得分:0)

另请参阅C#: How to Implement and use a NotNull and CanBeNull attribute以获取有关代码合同的更多信息,如何在VS2008中实施它们,以及如何将它们集成到VS2010中。