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)
这种参数验证成为一种常见的模式,并导致许多"近似样板"代码在我们的公共方法中跋涉.
如果没有内置的东西.我们可以使用哪些优秀的免费图书馆?
我通常创建静态辅助方法......
例如
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)
如果您真的很喜欢,您可能可以使用反射来询问参数名称。反射有点慢,所以只有在要抛出异常时才需要这样做,但它可以让您不必一直键入文字参数名称。