是否匿名函数在循环中占用更多内存
本文关键字:内存 循环 函数 是否 | 更新日期: 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
有时发现幕后发生的事情是相当令人惊讶的。