我在想。以下代码段是否比第二个
消耗更多内存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()...
我想知道第一个代码段是否使用更多内存,因为它必须存储匿名方法。或者每次指向同一个匿名函数
第二个代码片段是指向该函数还是每次都存储整个函数
由于
答案 0 :(得分:2)
我无法确定.NET,但一般情况下,这取决于匿名函数是否从投降函数中捕获任何元素(例如,在您的示例中为myList
)。如果不是,则可以通过编译器将其更改为具有编译器生成的名称的普通静态函数。
如果它捕获了某些内容,那么编译器必须生成并分配一个额外的数据结构,该数据结构存储捕获的变量并将其用作编译器生成的函数的参数。例如。如果你做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;
...
}
答案 1 :(得分:2)
第一种方法将创建一个带有方法的内部类,并将该方法分配给您要添加到列表中的{{1}}代理。
但是,它似乎只会实例化一个Action并且每次都将其添加到列表中
资料来源:http://shoutcast.radio24.it:8000/
第二种方法相当于
{{1}}
所以它会在每个循环中实例化一个新的Action。
你可以测试它,看第一种方法只会实例化一个动作:
tryroslyn
有时候发现幕后发生的事情会非常令人惊讶。