假设一个方法有一个可选的 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
- 检查它们的每个潜在用途。
我想,如果 lambda 表达式只执行一次,那么最好只执行 null
-在那一点上检查。
但是,我很好奇该方法何时构造一个将多次调用 lambda 表达式的对象。假设参数通常是null
,那么这个问题似乎简化为一个更简单的问题:它比 null
更快吗? -检查 lambda 或执行什么都不做的 lambda?
最佳答案
如果你勾选this answer你会看到一些非常相似的委托(delegate)问题的性能基准,尽管在这种情况下它与引发事件有关:
The cost for raising an event with an empty delegate is roughly twice that for raising it with a null check first.
我想您的情况对性能的影响是相似的。
关于c# - 可空的 lambda 参数是否应该替换为透明的实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42266334/