c# - c# 中的闭包会导致代码膨胀吗?

标签 c# clr

C# 中的闭包会导致生成的 il 中的代码膨胀吗?我被告知要避免使用带有闭包变量的 lambda,因为它们会在目标文件中生成隐藏类,这些类可以存储 lambda 的上下文。每个带有封闭变量的 lambda 的类。这是真的?还是编译器会重用现有类,例如 Tuple 或某些内部类?

最佳答案

额外的类仅在需要时生成 - 当您捕获 this 以外的变量时。但是,在大多数情况下,这并不是真正的代码膨胀 - 必要为了让委托(delegate)按照您需要的方式工作。

某些情况下,您可以自己编写更高效的代码,但通常要获得具有相同效果的委托(delegate),您最终会编写类似于编译器为您生成的代码...但阅读起来要困难得多。

大多数时候你不应该担心这种“膨胀” - 避免从性能微优化开始 - 优化可读性,衡量性能而不是猜测.然后,您可以攻击真正重要的代码位,并且当您证明这是值得的时候,可能会牺牲一点可读性来提高性能。

(编写现代 C# 并有意避免使用 lambda 表达式就像尝试将一只手绑在背后进行编码。如果向您提供建议的人担心闭包的“膨胀”,您可能会通过以下方式让他心脏病发作他是在 C# 5 中为 async/await 生成的状态机...)

关于c# - c# 中的闭包会导致代码膨胀吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10574054/

相关文章:

c# - emguCV-快速计算二进制图像中带孔的对象的面积

c# - 使用 iTextSharp 设置单元格对齐方式和(备用)背景行颜色

.net - .NET 程序集上的 AppLocker DLL 规则

.net - 新 .Net 流程的成本

c# - JVM 和 CLR 如何知道何时启动

c++ - 在 mida 保护下的 Dllmain 死锁

c# - 是否可以强制将所有 DateTime 属性建模为 DateTime2?

c# - Azure Functions - 获取中间件中的参数值

c# - 正则表达式不起作用并且超时

c# - 设置一个 c# 方法范围的变量如何影响另一个?