我们使用.NET 2.0框架和C# 3.0 (我认为这是可以在2.0版本的框架上运行的C#的最后一个版本,如果我错了,请纠正我)。
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;
}这种类型的参数验证成为一种常见的模式,并导致在我们的公共方法中需要处理许多“几乎是样板”的代码。
如果没有内置任何东西。有没有什么很棒的免费库可以供我们使用?
发布于 2010-08-03 20:26:44
我通常创建静态帮助器方法...
例如。
public static void CheckNotNull(object value, string parameterName)
{
if(value == null) { throw new ArgumentNullException(parameterName); }
}这意味着你可以把你的代码压缩成类似下面的东西,让它更整洁一点。
CheckNotNull(username, "username");
CheckNotNull(password, "password"); 或者,您可以将其包装为扩展方法:
public static void CheckNotNull<T>(this T value, string parameterName)
{
if(value == null) { throw new ArgumentNullException(parameterName); }
}并像这样使用:
username.CheckNotNull("username");
password.CheckNotNull("password");如果你真的觉得很花哨,你可以使用反射来询问参数名。反射有点慢,所以你只有在抛出异常的时候才会这么做,但它省去了你一直在输入文字参数名的时间。
发布于 2010-08-03 20:31:05
您可以使用像Post Sharp这样的il编织器,请记住,在C# 5中,编译器作为一种服务将使这种东西成为内置的东西。
就我个人而言,我不推荐这种方法,除非问题很严重,必须解决。通常,像上面描述的那样执行一些断言和检查前提条件是一种最佳实践。
例如:
public ConnectionSettings(
[NotNullOrEmpty] string url,
[NotNull] string username,
[NotNull] string password,
bool checkPermissions)
{
this.url = url;
this.username = username;
this.password = password;
this.checkPermissions = checkPermissions;
}您还可以将这类内容与code contracts集成,这将允许您执行一些丰富的静态分析。
发布于 2010-08-03 20:26:38
What are your favorite extension methods for C#? (codeplex.com/extensionoverflow)
public static class Extensions
{
public static void ThrowIfArgumentIsNull<T>(this T obj, string parameterName) where T : class
{
if (obj == null) throw new ArgumentNullException(parameterName + " not allowed to be null");
}
}
internal class Test
{
public Test(string input1)
{
input1.ThrowIfArgumentIsNull("input1");
}
}https://stackoverflow.com/questions/3396303
复制相似问题