C#-在lambdas中闭包是如何工作的,垃圾收集器是如何处理它们的?

C#-在lambdas中闭包是如何工作的,垃圾收集器是如何处理它们的?,c#,lambda,garbage-collection,C#,Lambda,Garbage Collection,在Java中,这样修改局部变量会导致: 我在封闭范围内定义的局部变量必须是final或有效final 然而,翻译成c#的代码与预期的一样有效 inti=0; 定时器=新定时器(1); 计时器运行时间+=(源,参数)=>{ i++; }; timer.AutoReset=false; timer.Enabled=true; 控制台写入线(i); 系统线程线程睡眠(100); 控制台写入线(i); 0 一, 这是如何工作的,它与Java中的相同代码有何不同?垃圾收集器如何知道何时处理变量,例如i?

在Java中,这样修改局部变量会导致:

我在封闭范围内定义的局部变量必须是final或有效final

然而,翻译成c#的代码与预期的一样有效

inti=0;
定时器=新定时器(1);
计时器运行时间+=(源,参数)=>{
i++;
};
timer.AutoReset=false;
timer.Enabled=true;
控制台写入线(i);
系统线程线程睡眠(100);
控制台写入线(i);
0

一,

这是如何工作的,它与Java中的相同代码有何不同?垃圾收集器如何知道何时处理变量,例如
i

在c#中,闭包关闭变量而不是值。lambda保留对
i
的引用,而不是值。对
i
的外部更改对lambda可见,反之亦然

这个答案可能有帮助

它是通过一个闭包来实现的


闭包是一个代码块,可以在以后执行,但它保留并维护通过使用编译器生成的类首次创建闭包的环境。它仍然可以使用局部变量,即使在方法完成时,垃圾收集器仍会保持对它需要的任何内容的引用计数,并且不会收集任何不应该收集的内容。

垃圾收集器根本不处理局部变量。当方法退出时,包含局部变量的堆栈帧将始终被销毁。该技巧的工作方式与Java中的脏工作方式相同,即用具有该类型字段的对象替换局部变量,只是编译器在幕后为您执行此操作。