我们正在尝试在我们的方法中找到一种更加重构的方法来测试null参数,以便代替编写:
if (arg1 == null)
{
throw new ArgumentNullException("arg1")
}
thing1 = arg1;
我们的开发人员可以做类似
的事情thing1 = ArgumentNotNull(() => arg1);
以下是上例中ArgumentNotNull的代码:
public static void ArgumentNotNull<T>(Expression<Func<T>> member)
where T : class
{
var argumentName = ((MemberExpression)member.Body).Member.Name;
var func = member.Compile();
var argumentValue = func();
if (argumentValue == null)
{
throw new ArgumentNullException(argumentName);
}
}
我对我们这样做的一个问题是:对于像这个检查一样微不足道的事情,Expression.Compile()是否过于昂贵?
我感觉我们可能会看到一些问题,因为参数的数量和对方法的调用都会增加......
答案 0 :(得分:2)
.Compile()
调用非常昂贵,但可以通过将编译的方法缓存为类似静态Dictionary<TKey, TValue>
的方法来缓解,其中键是member
的类型。这样,您的第一次调用将会很慢,其余的将与常规方法调用一样快,因为您将重用您的方法以便在将来检查给定类型。缺点:许多不同类型可能存在内存膨胀或泄漏。