C# 中的闭包会导致生成的 il 中的代码膨胀吗?我被告知要避免使用带有闭包变量的 lambda,因为它们会在目标文件中生成隐藏类,这些类可以存储 lambda 的上下文。每个带有封闭变量的 lambda 的类。这是真的?还是编译器会重用现有类,例如 Tuple 或某些内部类?
最佳答案
额外的类仅在需要时生成 - 当您捕获 this
以外的变量时。但是,在大多数情况下,这并不是真正的代码膨胀 - 必要为了让委托(delegate)按照您需要的方式工作。
在某些情况下,您可以自己编写更高效的代码,但通常要获得具有相同效果的委托(delegate),您最终会编写类似于编译器为您生成的代码...但阅读起来要困难得多。
大多数时候你不应该担心这种“膨胀” - 避免从性能微优化开始 - 优化可读性,衡量性能而不是猜测.然后,您可以攻击真正重要的代码位,并且当您证明这是值得的时候,可能会牺牲一点可读性来提高性能。
(编写现代 C# 并有意避免使用 lambda 表达式就像尝试将一只手绑在背后进行编码。如果向您提供建议的人担心闭包的“膨胀”,您可能会通过以下方式让他心脏病发作他是在 C# 5 中为 async/await 生成的状态机...)
关于c# - c# 中的闭包会导致代码膨胀吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10574054/