通过引用传递数组元素

时间:2011-10-18 12:31:43

标签: c#

  

可能重复:
  C# parameters by reference and .net garbage collection

我在考虑使用ref参数来限制数组的边界检查。例如,交换两个元素的代码是:

class Test {
  int[] array;

  private void qSort() {
    ...blah...
    int temp = array[a];
    array[a] = array[b];
    array[b] = temp;
  }
}

有4个访问数组的权限 另一种选择是:

class Test {
  int[] array;

  private void qSort() {
  ...blah...
    Swap( ref array[a], ref array[b] );
  }

  static void Swap(ref int a,ref int b) {
    int temp = a;
    a=b;
    GC.Collect();  // suppose this happens
    b=temp;
  }
}

理论上只有2个访问数组

让我感到困惑的是,当我通过ref传递数组元素时,我不知道到底发生了什么。如果Garbage Collector启动,在Swap函数中执行代码时,是否能够移动数组?或者在调用期间固定数组?

请注意,上面的代码是一个简单的测试用例。我想在更复杂的场景中使用它

编辑:正如BrokenGlass指出的那样,Eric Lippert在C# parameters by reference and .net garbage collection

回答了这个问题

数组不会被固定,GCollector可以移动它,并且会根据堆栈中的元素更新任何引用

2 个答案:

答案 0 :(得分:1)

Swap函数仍然可以访问数组3或4次,Swap函数不会提供比简单代码更高的性能优势。如果重复使用它可能会有用。

static void Swap(ref int a, ref int b) 
{     
    int temp = a;  //<-- Here, a is in the array
    a=b;           //<-- a and b are in the array
    b=temp;        //<-- b is in the array
}

垃圾收集器不会释放你有引用的内存,就像你通过引用传递一样。

答案 1 :(得分:0)

堆栈可能如下所示:

  • qSort()引用了数组
  • 切换()

因此,如果GC.Collect()在swap中执行,那么qSort()中仍然会引用该数组,这意味着它不会被收集。