相关疑难解决方法(0)

C#参数通过引用和.net垃圾回收

我一直试图找出.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上被压缩(我能找到)与将托管引用传递给非托管代码有关.希望这是因为我不必担心托管代码中的任何托管引用.:)

c# pass-by-reference

15
推荐指数
2
解决办法
3481
查看次数

标签 统计

c# ×1

pass-by-reference ×1