【发布时间】:2017-08-08 15:51:50
【问题描述】:
我有一个类 Test 包含两个成员,一个 (arr) 占用大量内存,另一个 (b) 不占用:
public class Test
{
public Test() {
Arr = new int[100000000];
}
public bool B {get; private set;}
public int[] Arr {get; private set;}
}
稍后在我的代码中,我想以这种方式存储一个 lambda 表达式:
// `test` has been declared somewhere as an instance of Test
Action lambda = () => {
if (test.B)
// Do things
}
这个闭包的内存消耗是多少?
它会在其环境中保存整个 Test 对象,还是仅保存 Test.b?
我应该这样做吗:
var tmpB = test.B;
Action lambda = () => {
if (tmpB)
// Do things
}
【问题讨论】:
-
不是答案,但
myInt = 1应该怎么做? lambdas 不接受ref参数,所以这个赋值将没有效果。 -
"它会将整个 Test 对象保存在其环境中,还是仅保存 Test.b?"两者都不是,它只是持有一个对
test的引用。 -
我做了一个最小的例子,我忘记了 ref,在我的代码中它是一个我要修改的列表,让我更正一下
-
如果您发布实际代码而不是无法编译的代码,并且在编写该代码时也遵循 .NET 命名约定,这将非常有帮助。跨度>
-
@RenéVogt 一个 lambda 可以接受
ref参数,尽管那个特定的参数没有。可以写成var lambda = (ref myInt) =>[...]。