2011-10-18 45 views
8

可能重复:
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更新任何裁判回答到它的一个元件,驻留在堆栈上

+2

不要试图过早地优化*特别是如果您对机器的工作方式没有深入的了解。例子:由于拳击,你的第二个版本(用'ref')实际上会比第一个版本慢得多(在循环中试试看)。 – Jon

+4

@Jon,我同意这样做可能没有意义,因为性能的原因,但它确实提高了可读性......而且顺便说一句,在这种情况下没有拳击 –

+0

Panos,添加了一个GC.Collect()来强调点如果你不喜欢就回滚。 –

回答

0

堆栈可能看起来像这样:

  • 的qsort()具有到所述阵列的参考
  • 交换()

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

0

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 
} 

垃圾收集器将不会释放内存,你有参考到,当你通过引用传递发生。

相关问题