【发布时间】:2019-02-04 19:48:29
【问题描述】:
我有一个像这样的Main 方法:
static void Main(string[] args)
{
var b = new byte[1024 * 1024];
Func<double> f = () =>
{
new Random().NextBytes(b);
return b.Cast<int>().Average();
};
var avg = f();
Console.WriteLine(avg);
}
由于我在这里访问一个局部变量b,编译器创建一个类来捕获该变量,b 成为该类的字段。然后b 的生命周期与编译器生成的类的生命周期一样长,它会导致内存泄漏。即使b 超出范围(可能不在这种情况下,但想象这是在另一个方法内部而不是Main),字节数组也不会被释放。
我想知道的是,既然在声明 Func 后我没有在任何地方访问或修改 b,为什么编译器不能内联该局部变量而不费心创建一个类?像这样:
Func<double> f = () =>
{
var b = new byte[1024 * 1024];
new Random().NextBytes(b);
return b.Cast<int>().Average();
};
我在 Debug 和 Release 模式下编译了这段代码,DisplayClass 是在这两种模式下生成的:
这只是没有作为优化实现还是我缺少什么?
【问题讨论】:
-
提示:使用本地函数而不是委托,编译器将捕获类型生成为结构而不是类:sharplab.io/…
标签: c# closures compiler-optimization cil