假设某个方法有一个可选的Action
或Func<T, T>
参数,通常是null
的默认值。通常 - null
lambda表达式将被多次调用。
在这种情况下,最好是:
在每次使用之前检查lambda表达式,或者......
一个。使用Action
调用可为空的action?.Invoke()
。
湾将可空变换Func<T, T>
调用为transform == null ? value : transform(value)
。
...在调用方法时检查表达式一次,然后用透明变体替换它?
一个。将null
Action
替换为new Action(() => { })
。
湾将null
Func<T, T>
替换为new Func<T, T>((T value) => { return value; })
。
对于这个问题,请假设:
这是深层嵌套的数学代码,所以它的性能是相关的。
代码的可读性没有受到任何影响。
我问这个问题是因为我经常有方法允许可选的lambda表达式,这些表达式非常有用,但是我不确定我是否应该null
- 在声明时检查它们,或者我应该null
1}} - 检查每种潜在用途。
我想,如果lambda表达式只执行一次,那么最好只null
- 检查那一点。
但是,我很好奇该方法何时构造一个将多次调用lambda表达式的对象。假设参数通常为null
,那么似乎这个问题简化为一个更简单的问题:null
更快 - 检查一个lambda或执行一个没有什么都不做?
答案 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)
{
}