Expression.Compile对参数null检查的性能影响

时间:2014-03-05 17:30:43

标签: c# performance linq

我们正在尝试在我们的方法中找到一种更加重构的方法来测试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()是否过于昂贵?

我感觉我们可能会看到一些问题,因为参数的数量和对方法的调用都会增加......

1 个答案:

答案 0 :(得分:2)

.Compile()调用非常昂贵,但可以通过将编译的方法缓存为类似静态Dictionary<TKey, TValue>的方法来缓解,其中键是member的类型。这样,您的第一次调用将会很慢,其余的将与常规方法调用一样快,因为您将重用您的方法以便在将来检查给定类型。缺点:许多不同类型可能存在内存膨胀或泄漏。