如何避免参数验证

Jam*_*ead 5 c# argument-validation

验证原始参数和"复杂数据"

验证参数

在编写方法时,应在执行任何操作之前首先验证参数.例如,假设我们有一个代表人的类:

public class Person
{
    public readonly string Name;
    public readonly int Age;

    public class Person(string name, int age)
    {
        this.Name = name;
        this.Age = age;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个Person类出了什么问题?在将值设置为Person字段之前,不验证名称和年龄."验证?"是什么意思?应该检查两个参数,它们的值是可接受的.例如,如果name的值是空字符串怎么办?或者年龄的值是-10?

通过在值不可接受时抛出ArgumentExceptions或派生异常来执行验证参数.例如:

public class Person(string name, int age)
{
    if (String.IsNullOrEmpty(name))
    {
        throw new ArgumentNullException
            ("name", "Cannot be null or empty.");
    }

    if (age <= 0 || age > 120)
    {
        throw new ArgumentOutOfRangeException
            ("age", "Must be greater than 0 and less than 120.");
    }

    this.Name = name;
    this.Age = age;
}
Run Code Online (Sandbox Code Playgroud)

这适当地验证了Person的构造函数接收的参数.

乏味广告恶心

因为你已经在很长一段时间内验证了参数(对吗?),你可能已经厌倦了写这些if(....)在你的所有方法中抛出Argument ...语句.

我们可以做些什么来避免在整个代码中写入String.IsNullOrEmpty数十亿次?

LBu*_*kin 6

您可以在.NET 4.0中查看代码约定.

如果您不想等待代码合同,您可能还想查看CodePlex上的FluentValidation库.

最终,您仍然需要将控制参数值的规则放在某处 - 这只是决定您是否更喜欢命令式样式(例如string.IsNullOrEmpty)或声明性样式.

验证输入是编写可靠代码的关键实践 - 但它肯定是重复和冗长的.