是否匿名函数在循环中占用更多内存

本文关键字:内存 循环 函数 是否 | 更新日期: 2023-09-27 18:13:37

我很好奇。下面的代码段是否比第二个

占用更多的内存?
List<Action> myList = new List<Action>();
for(int i = 0; i < 10000; i++)
{
   myList.Add(() => { /* Code */});
}

这一次,我指向一个方法。

List<Action> myList = new List<Action>();
for (int i = 0; i < 10000; i++)
{
   myList.Add(myFuntion);
}
void myFuntion()...

我想知道如果第一个代码片段使用更多的内存,因为它必须存储匿名方法。还是每次

都指向同一个匿名函数?

第二个代码片段是指向函数还是每次都存储整个函数

谢谢

是否匿名函数在循环中占用更多内存

我不能确定。net,但一般来说,这取决于匿名函数是否从投降函数捕获任何元素(例如,在您的示例中myList)。如果不是in,编译器可以将其更改为具有编译器生成的名称的普通静态函数。

如果它捕获了一些东西,那么编译器必须生成并分配一个额外的数据结构来存储捕获的变量,并将其用作编译器生成的函数的参数。例如,如果你做myList.Add(() => { var z = myList.Count; .... });,编译器需要为它生成这样的东西:

class GenertedEnv
{
    public List<Action> myList;
}
static void AnonymousFunction(GeneratedEnv env, /* Plus other lambda parameters*/)
{
    var z = env.myList.Count;
    ...
}

第一个方法将创建一个带有方法的内部类,并将该方法分配给您要添加到列表中的Action委托。
然而,它似乎只会实例化一个Action并每次将其添加到列表中。
来源:tryroslyn

第二个方法相当于
list.Add(new Action(MyFunction));

所以它会在每个循环中实例化一个新的Action。

你可以测试它,看到第一个方法将只实例化一个Action:
dotnetfiddle
有时发现幕后发生的事情是相当令人惊讶的。