我试图了解编译器支持的委托缓存的边缘情况以避免内存分配。
例如,据我了解,此委托被缓存到单个实例并被重用,因为它不会关闭任何局部变量:
int[] set = new [] { 1, 2, 3, 4, 5, 6 };
var subset = set.Where(x => x % 2 == 0);现在,在某些情况下,我生成的代码可能想直接调用委托,因此匿名方法在 C# 中无效,如下所示:
var result = (x => x % 2 == 0).Invoke(5); // Invalid
为了避免这种情况,我看到了两种选择:
使用构造函数:
var result = (new Func<int, bool>(x => x % 2 == 0)).Invoke(5);
铸造匿名委托:
var result = ((Func<int, bool>)(x => x % 2 == 0)).Invoke(5);
我假设编译器不会在选项 #1 中缓存委托,但我不确定它是否会在 #2 中缓存。
这在任何地方都有记录吗?
茅侃侃
相关分类