Да, лямбда будет создавать мусор, если замыкание захватывает переменную из локальной области (т. Е. 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));
}
Обратите внимание, что в результирующем коде есть два экземпляра new
, что означает, что выделяются не только Action
объекты (замыкания), но и объекты для хранения захваченных переменных ( экранирование переменных записей).