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。即使该方法已完成,它仍然可以使用局部变量,垃圾收集器维护对它需要的任何内容的引用计数,并且不会收集任何不应该收集的内容