【发布时间】:2011-01-30 20:19:08
【问题描述】:
我一直试图弄清楚 .NET 垃圾收集系统的复杂性,并且我有一个与 C# 引用参数相关的问题。如果我理解正确,方法中定义的变量存储在堆栈中,不受垃圾收集的影响。所以,在这个例子中:
public class Test
{
public Test()
{
}
public int DoIt()
{
int t = 7;
Increment(ref t);
return t;
}
private int Increment(ref int p)
{
p++;
}
}
DoIt() 的返回值为 8。由于 t 的位置在堆栈上,因此该内存不能被垃圾收集或压缩,并且 Increment() 中的引用变量将始终指向 t 的正确内容.
但是,假设我们有:
public class Test
{
private int t = 7;
public Test()
{
}
public int DoIt()
{
Increment(ref t);
return t;
}
private int Increment(ref int p)
{
p++;
}
}
现在,t 存储在堆中,因为它是我的类的特定实例的值。如果我将此值作为参考参数传递,这可能不是问题吗?如果我将 t 作为参考参数传递,p 将指向 t 的当前位置。但是,如果垃圾收集器在压缩期间移动了这个对象,那会不会弄乱 Increment() 中对 t 的引用?或者垃圾收集器是否会更新通过传递引用参数创建的引用?我有必要担心这个吗?唯一提到担心 MSDN 上的内存被压缩(我可以找到)是关于将托管引用传递给非托管代码。希望那是因为我不必担心托管代码中的任何托管引用。 :)
【问题讨论】:
-
底线:规范承诺它会起作用,因此实现会让它起作用。
标签: c# pass-by-reference