可能重複:
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()來強調點如果你不喜歡就回滾。 –