2011-10-18 64 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 
} 

垃圾收集器將不會釋放內存,你有參考到,當你通過引用傳遞發生。

相關問題