C#Lambda =>生成垃圾吗?

使用lambda表达式是否会为与正常foreach循环相对的GC生成垃圾?

// Lambda version Foos.ForEach(f=>f.Update(gameTime)); // Normal approach: foreach (Foo f in Foos) { f.Update(gameTime); } 

CLR分析器显示我有69.9%system.Action ,我怀疑是如上所述的foreach循环的lamba版本。 真的吗?

编辑:我使用Microsoft CLR分析器: http : //download.microsoft.com/download/4/4/2/442d67c7-a1c1-4884-9715-803a7b485b82/clr%20profiler.exe或http://msdn.microsoft .COM / EN-US /库/ ff650691.aspx

是的,如果闭包从本地范围捕获变量(即此上下文中的gameTime ),则lambda将创建垃圾。

例如,以下C#函数:

 static void TestLambda(List Foos, DateTime gameTime) { Foos.ForEach(f => f.Update(gameTime)); } 

将被翻译为:

 private static void TestLambda(List Foos, DateTime gameTime) { Program.<>c__DisplayClass1 <>c__DisplayClass = new Program.<>c__DisplayClass1(); <>c__DisplayClass.gameTime = gameTime; Foos.ForEach(new Action(<>c__DisplayClass.b__0)); } 

请注意,结果代码中有两个 new实例,这意味着不仅要分配Action对象(闭包),还要保存捕获变量的对象(转义变量记录)。

在这种情况下,我认为您正在使用将生成新类型的generics方法(ForEach)(假设Foo是引用类型,将只生成一个新类型),并且lambda将被编译为常规匿名方法。 没有任何关于这表明内存使用的任何线性增加。

就剖析器而言,您没有测量有关内存或GC的任何信息。 您正在测量执行该方法所花费的时间,并且lambda不应该比“常规”方式慢得多。