与普通的 foreach 循环相反,使用 lambda 表达式是否会为 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 循环的lambda 版本。真的吗?
编辑:我使用了 Microsoft CLR 分析器:http://download.microsoft.com/download/4/4/2/442d67c7-a1c1-4884-9715-803a7b485b82/clr%20profiler.exe http://download.microsoft.com/download/4/4/2/442d67c7-a1c1-4884-9715-803a7b485b82/clr%20profiler.exe
or http://msdn.microsoft.com/en-us/library/ff650691.aspx http://msdn.microsoft.com/en-us/library/ff650691.aspx
是的,如果闭包从本地范围捕获变量(即,lambda 会产生垃圾)gameTime
在这种情况下)。
例如,以下 C# 函数:
static void TestLambda(List<Foo> Foos, DateTime gameTime)
{
Foos.ForEach(f => f.Update(gameTime));
}
将被翻译成这样:
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));
}
请注意,有two的实例new
在生成的代码中,这意味着不仅有Action
被分配的对象(闭包),还有保存捕获变量(转义变量记录)的对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)