更好的参数检查方式?

Del*_*ted 8 c# parameters parameter-passing

我们使用.NET 2.0框架和C#3.0(我认为它是C#的最后一个版本,它可以在2.0版本的框架上运行,如果我错了,请纠正我).

是否有内置于C#中的内容可以使这种类型的参数验证更方便?

public ConnectionSettings(string url, string username, string password,
                          bool checkPermissions)
{
    if (username == null) {
        throw new ArgumentNullException("username");
    }

    if (password == null) {
        throw new ArgumentNullException("password");
    }

    if (String.IsNullOrEmpty(url)) {
        throw new ArgumentException("Must not be null or empty, it was " +
            (url == null ? url : "empty"), "url");
    }

    this.url = url;
    this.username = username;
    this.password = password;
    this.checkPermissions = checkPermissions;
}
Run Code Online (Sandbox Code Playgroud)

这种参数验证成为一种常见的模式,并导致许多"近似样板"代码在我们的公共方法中跋涉.

如果没有内置的东西.我们可以使用哪些优秀的免费图书馆?

Ian*_*Ian 4

我通常创建静态辅助方法......

例如

public static void CheckNotNull(object value, string parameterName)
{
   if(value == null) { throw new ArgumentNullException(parameterName); }
}
Run Code Online (Sandbox Code Playgroud)

意味着您可以将代码压缩为类似于下面的代码,并使其更加整洁。

CheckNotNull(username, "username");
CheckNotNull(password, "password"); 
Run Code Online (Sandbox Code Playgroud)

或者您可以将其包装为扩展方法:

public static void CheckNotNull<T>(this T value, string parameterName)
{
   if(value == null) { throw new ArgumentNullException(parameterName); }
}
Run Code Online (Sandbox Code Playgroud)

并使用如下:

username.CheckNotNull("username");
password.CheckNotNull("password");
Run Code Online (Sandbox Code Playgroud)

如果您真的很喜欢,您可能可以使用反射来询问参数名称。反射有点慢,所以只有在要抛出异常时才需要这样做,但它可以让您不必一直键入文字参数名称。