2016-08-30 36 views
-2

在C#,數組通過引用傳遞給函數,這意味着該代碼:爲什麼我不能在函數中重新初始化數組?

static void FillArray(int[] A) { 
    for (int i = 0; i < A.Length; i++) { 
      A[i] = -1; 
    } 
} 

static void Main(string[] args) { 
    int[] A = new int[10]; 

    FillArray(A); 

    Console.WriteLine(string.Join(" ", A)); 
} 

將產生-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 它是希望的答案。但是,如果我重新初始化數組是這樣的:

static void FillArray(int[] A) { 
    A = new int[2*A.Length]; 
    for (int i = 0; i < A.Length; i++) { 
     A[i] = -1; 
    } 
} 

輸出將是0 0 0 0 0 0 0 0 0 0

不應該A更改,因爲它作爲函數的參考傳遞?

+1

'A'是一個引用對象。但是您正在通過值傳遞該引用對象。 @JonSkeet在這個 – Jonesopolis

+1

上有一個很好的文章(http://jonskeet.uk/csharp/parameters.html)'int []'是一個引用類型,但'A'不是通過引用傳遞的。他們是兩個不同的術語,許多人混在一起。術語「引用類型」是關於類型的。術語「傳遞參考」是關於變量的。您可以通過將方法更改爲:'FillArray(ref int [] A)''來引用'A'。 –

+0

開始閱讀一些c#文檔的好時機..... – Eser

回答

1

您可以更改數組中包含的值A,但不能更改A。當你調用一個方法時,你實際上傳遞了參數值的副本(默認)。如果你想改變A你必須通過引用傳遞它,使用ref關鍵字:

static void FillArray(ref int[] A) { 
    A = new int[2*A.Length]; 
    for (int i = 0; i < A.Length; i++) { 
     A[i] = -1; 
    } 
} 
1

內部,數組的地址被傳遞什麼。通過修改該數組中的項目,調用者將看到這些更改。但是,如果將數組分配給新數組,則不再指向調用者的數組。調用者不會看到該數組的任何更改。

所以,雖然數組通過引用傳遞,但引用本身是通過值傳遞的,除非使用關鍵字ref

2

時FillArray開始運行它有一個叫做變量,指向你改變了當地的一個指向一個不同的數組的數組,你設置在主(巧合稱爲A)

在你的第二個案例。因此,您所做的任何更改都不會被調用代碼看到 - 2個變量之間沒有關係

真的,這不是'通過引用'參數傳遞,因爲更改傳遞值(A)不會反映在調用者空間。你正在通過值得到一個'指針'(因爲c#會引用它不是指針,因爲託管代碼沒有指針)

相關問題