【发布时间】:2016-06-22 20:32:05
【问题描述】:
在我问过this question 并阅读了这个推荐的article about closures 之后,我开始问自己,在 C# 中进行闭包是否涉及装箱。
正如文章中所说,这行代码将通过使myVar 存在于其范围之外来创建一个闭包:
public static Func<int,int> GetAFunc()
{
var myVar = 1;
Func<int, int> inc = delegate(int var1)
{
myVar = myVar + 1;
return var1 + myVar;
};
return inc;
}
正如那里所解释的,编译器生成的类的对象被实例化,以将该变量的值携带到其范围之外。我的问题来了:由于变量确实位于堆栈上,使其成为对象的一部分,并不意味着闭包涉及装箱吗?
【问题讨论】:
-
变量不位于堆栈上。 C# 编译器重写您的代码,myVar 成为类的一个字段。任何地方都没有拳击。使用 ildasm.exe 亲自查看。
-
当值类型是另一种类型的字段时,没有装箱...您可能需要再次查看为闭包生成的代码。