我一直试图找出.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++;
}
}
Run Code Online (Sandbox Code Playgroud)
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++;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,t存储在堆上,因为它是我的类的特定实例的值.如果我将此值作为参考参数传递,这可能不是问题吗?如果我将t作为参考参数传递,p将指向t的当前位置.但是,如果垃圾收集器在压缩过程中移动此对象,那么会不会在Increment()中弄乱对t的引用?或者垃圾收集器是否更新通过传递引用参数创建的引用?我根本不用担心这件事吗?唯一提到的担心内存在MSDN上被压缩(我能找到)与将托管引用传递给非托管代码有关.希望这是因为我不必担心托管代码中的任何托管引用.:)