可能重复:
C# parameters by reference and .net garbage collection传递数组元素由参
我想使用参考参数来限制边界阵列的检查。例如交换两个元素的代码是:
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传递一个数组元素时,我不知道发生了什么。如果垃圾收集器在执行Swap函数中的代码时插入,将能够移动数组?或者该阵列在通话期间固定?
请注意,上面的代码是一个简单的测试用例。我想用它在更复杂的方案
编辑:BrokenGlass指出,这是由埃里克利珀这里C# parameters by reference and .net garbage collection
的阵列将无法固定和GCollector可以移动,并会accordinly更新任何裁判回答到它的一个元件,驻留在堆栈上
不要试图过早地优化*特别是如果您对机器的工作方式没有深入的了解。例子:由于拳击,你的第二个版本(用'ref')实际上会比第一个版本慢得多(在循环中试试看)。 – Jon
@Jon,我同意这样做可能没有意义,因为性能的原因,但它确实提高了可读性......而且顺便说一句,在这种情况下没有拳击 –
Panos,添加了一个GC.Collect()来强调点如果你不喜欢就回滚。 –