C# 中的闭包是否会导致代码膨胀
本文关键字:代码 膨胀 是否 闭包 | 更新日期: 2023-09-27 18:33:58
C# 中的闭包会导致生成的 il 中的代码膨胀吗?我被告知要避免使用闭包变量的 lambda,因为它们会在对象文件中生成隐藏类,这些类可以存储 lambda 的上下文。每个 lambda 的类,具有封闭的 over 变量。这是真的吗?或者编译器是否重用现有类,如元组或某个内部类?
额外的类仅在需要时才生成 - 当您捕获 this
以外的变量时。但是,在大多数情况下,这并不是真正的代码膨胀 - 为了使委托按照您需要的方式工作,这是必要的。
在某些情况下,您可以自己编写更高效的代码,但通常为了获得具有相同效果的委托,您最终会编写类似于编译器为您生成的代码......但相当难读。
大多数时候,你不应该担心这种"膨胀"——避免对性能进行微优化——优化可读性,并衡量性能而不是猜测它。然后你可以攻击真正重要的代码,当你证明这是值得的时,也许为了性能而牺牲一点可读性。
(编写现代 C# 并刻意避免 lambda 表达式就像试图用一只手绑在背后进行编码。如果建议你的人担心闭包的"膨胀",你可能会给他一个心脏病发作,向他展示在 C# 5 中为 async/await 生成的状态机......
是的,这是真的。
跟踪变量的类需要存在。Tuple
或内部类无法对所有可能的代码路径执行此操作,因此需要在 IL 中专门为每个 lambda/闭包生成这样的状态机。
这是否是应用程序的问题由您决定。