使用lambda表达式是否会为与正常foreach循环相对的GC生成垃圾?
// Lambda version
Foos.ForEach(f=>f.Update(gameTime));
// Normal approach:
foreach (Foo f in Foos)
{
f.Update(gameTime);
}
Run Code Online (Sandbox Code Playgroud)
CLR分析器显示我有69.9%system.Action <T>并且我怀疑是如上所述的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
Gab*_*abe 24
是的,如果闭包从本地范围捕获变量(即gameTime在此上下文中),则lambda将创建垃圾.
例如,以下C#函数:
static void TestLambda(List<Foo> Foos, DateTime gameTime)
{
Foos.ForEach(f => f.Update(gameTime));
}
Run Code Online (Sandbox Code Playgroud)
将被翻译为:
private static void TestLambda(List<Foo> Foos, DateTime gameTime)
{
Program.<>c__DisplayClass1 <>c__DisplayClass = new Program.<>c__DisplayClass1();
<>c__DisplayClass.gameTime = gameTime;
Foos.ForEach(new Action<Foo>(<>c__DisplayClass.<TestLambda>b__0));
}
Run Code Online (Sandbox Code Playgroud)
请注意,结果代码中有两个实例new,这意味着不仅Action要分配对象(闭包),还要保存捕获变量的对象(转义变量记录).