C# - 闭包如何在 lambda 中工作以及垃圾收集器如何处理它们?
C# - How do closures work in lambdas and how does the garbage collector deal with them?
In Java, modifying a local variable like this would result in:
Local variable i defined in an enclosing scope must be final or effectively final
但是,翻译成 C# 的相同代码按预期工作
int i = 0;
Timer timer = new Timer(1);
timer.Elapsed += (source, arg) => {
i++;
};
timer.AutoReset = false;
timer.Enabled = true;
Console.WriteLine(i);
System.Threading.Thread.Sleep(100);
Console.WriteLine(i);
0
1
这是如何工作的,它与 Java 中的相同代码有何不同?垃圾收集器如何知道何时处理 i
?
等变量
在 C# 中,闭包关闭变量而不是值。 lambda 保留对 i
的引用而不是值。 i
的外部更改对 lambda 和 vice-versa 可见。
这个答案可能会有帮助
它通过 闭包
完成
A closure 是一个代码块,可以在以后执行,但是它通过使用编译器保持和维护它最初创建的环境生成 class。即使该方法已完成,它仍然可以使用局部变量,垃圾收集器维护对它需要的任何内容的引用计数,并且不会收集任何不应该收集的内容
In Java, modifying a local variable like this would result in:
Local variable i defined in an enclosing scope must be final or effectively final
但是,翻译成 C# 的相同代码按预期工作
int i = 0;
Timer timer = new Timer(1);
timer.Elapsed += (source, arg) => {
i++;
};
timer.AutoReset = false;
timer.Enabled = true;
Console.WriteLine(i);
System.Threading.Thread.Sleep(100);
Console.WriteLine(i);
0
1
这是如何工作的,它与 Java 中的相同代码有何不同?垃圾收集器如何知道何时处理 i
?
在 C# 中,闭包关闭变量而不是值。 lambda 保留对 i
的引用而不是值。 i
的外部更改对 lambda 和 vice-versa 可见。
这个答案可能会有帮助
它通过 闭包
完成A closure 是一个代码块,可以在以后执行,但是它通过使用编译器保持和维护它最初创建的环境生成 class。即使该方法已完成,它仍然可以使用局部变量,垃圾收集器维护对它需要的任何内容的引用计数,并且不会收集任何不应该收集的内容