在c#中执行闭包会导致代码膨胀吗?

Jer*_*ell 4 c# clr

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

Jon*_*eet 16

额外的类只有在需要时才会生成 - 当您捕获除以外的变量时this.但是,在大多数情况下,这并不是真正的代码膨胀 - 为了使委托以您需要的方式工作,这是必要的.

某些情况下,您可以自己编写更高效的代码,但通常为了获得具有相同效果的委托,您最终会编写与编译器为您生成的代码类似的代码......但是相当难以阅读.

大多数时候你不应该担心这种"臃肿" - 避免微观优化性能开始 - 优化可读性,测量性能而不是猜测它.然后你就可以攻击那些真正重要的代码,当你证明它值得的时候,可能会牺牲一些可读性来获得性能.

(编写现代C#并故意避免使用lambda表达式就像尝试用一只手绑在背后编码.如果提示你的人担心关闭的"膨胀",你可能会通过向他展示状态给他心脏病发作在C#5中为异步/等待生成的机器...)

  • +1.并重新:最后一段:不要读Jon的博客:-) (3认同)