应该用透明实现替换可空的lambda参数吗?

时间:2017-02-16 06:16:47

标签: c# performance optimization lambda

假设某个方法有一个可选的ActionFunc<T, T>参数,通常是null的默认值。通常 - null lambda表达式将被多次调用。

在这种情况下,最好是:

  1. 在每次使用之前检查lambda表达式,或者......

    一个。使用Action调用可为空的action?.Invoke()

    湾将可空变换Func<T, T>调用为transform == null ? value : transform(value)

  2. ...在调用方法时检查表达式一次,然后用透明变体替换它?

    一个。将null Action替换为new Action(() => { })

    湾将null Func<T, T>替换为new Func<T, T>((T value) => { return value; })

  3. 对于这个问题,请假设:

    • 这是深层嵌套的数学代码,所以它的性能是相关的。

    • 代码的可读性没有受到任何影响。

    我问这个问题是因为我经常有方法允许可选的lambda表达式,这些表达式非常有用,但是我不确定我是否应该null - 在声明时检查它们,或者我应该null 1}} - 检查每种潜在用途。

    我想,如果lambda表达式只执行一次,那么最好只null - 检查那一点。

    但是,我很好奇该方法何时构造一个将多次调用lambda表达式的对象。假设参数通常null,那么似乎这个问题简化为一个更简单的问题:null更快 - 检查一个lambda或执行一个没有什么都不做?

2 个答案:

答案 0 :(得分:1)

如果你检查this answer,你会看到一个非常相似的委托问题的性能基准,尽管在这种情况下它与提升事件有关:

  

使用空委托引发事件的成本大约是使用空检查提升事件的两倍。

我认为性能影响与您的情况类似。

答案 1 :(得分:0)

3。使用空方法应该比每次创建一个新的空lambda快一点:

static void _() { }

static void b(Action a = null)
{
    if (a == null) a = _;
}

4。避免空检查

static void _() { }

static void b() { b(_); }

static void b(Action a)
{

}