局部变量和堆栈

thu*_*eys 3 c# clr command-line-interface

以下代码段中会发生什么:

while (!Done)
{
     Data data = source.GetData();
     sink.ProcessData(data);
}
Run Code Online (Sandbox Code Playgroud)

是否data在每次循环迭代时将新引用放在堆栈上(从而防止对象data引用的垃圾收集),或者是在每次迭代中重用的引用?

Eri*_*ert 8

是否在每次循环迭代时将新的引用数据放在堆栈上(从而防止对象数据引用的垃圾收集),或者是在每次迭代中重用的引用?

我认为关于重复使用的"主要"问题已经得到了充分的回答,但是括号内容非常重要.你假设这可以防止垃圾收集是错误的.如果垃圾收集器检测到对"数据"的唯一引用是堆栈槽,并且没有人再次从它读取,那么即使堆栈上有引用,垃圾收集器也可以回收存储.如果消耗堆栈槽的东西是GC不知道的非托管代码,这可能会很糟糕.

如果你需要通过在堆栈上保留它来保持活着,那么你需要在方法中添加一个KeepAlive.