c# - 可空的 lambda 参数是否应该替换为透明的实现?

标签 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 Actionnew 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/

相关文章:

javascript - 使用自定义绑定(bind)、扩展器或自定义函数扩展 Knockout

javascript - 重新加载外部 javascript 文件的最佳和快速实践?

mysql - SQL select语句优化(id,parent_id,child_ids)

matlab - matlab中的非线性平方优化任务

c++ - 让 g++ 产生一个可以使用多核的程序?

Java 到 Win32 加密 API

c# - 使用并行程序集加载 x64 或 x32 版本的 DLL

c# - 我们可以设置面板背景图像的不透明度吗?

c# - 我无法更改 static void Main(string[] args)

javascript - jQuery 1.3 与 1.4(性能)