2017-03-03 74 views
-3

我有以下例如用於陣列修改陣列與方法C#

static void main() 
{ 
    int[] arr1 = { 1, 4, 5 }; 
    Console.WriteLine("{0}", arr1[0]);  
    ModifyArray(arr1); 
    Console.WriteLine("{0}", arr1[0]); 
} 

static void ModifyArray(int[] arr1) 
{ 
    arr1[0] = 20; 
    arr1 = new int[5] { -3, -1, -2, -3, -4 }; 
    Console.WriteLine("{0}", arr1[0]); 
} 

爲什麼它打印

1,-3,20-

代替

1,-3,-3

+0

問題尋求幫助調試絕(「爲什麼不是這個代碼工作的?」)包括所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建最小,完整和可驗證示例。 –

+0

[按值和引用傳遞數組]的可能重複(http://stackoverflow.com/questions/10325323/passing-arrays-by-value-and-by-reference) – ASh

+0

公平地說,如果您運行OP代碼它會給出他表示的結果。 OP的誤解與數組等引用類型通過傳遞參數*的值*來傳遞。 –

回答

3

該程序行爲正常。

參考的複印件arr1是按值傳遞給ModifyArray(),所以當你分配一個新的值arr1ModifyArray()它不會改變原來的數組。

如果你想改變原來的數組引用您必須使用ref關鍵字,像這樣由參傳遞:

public static void Main() 
{ 
    int[] arr1 = { 1, 4, 5 }; 
    Console.WriteLine("{0}", arr1[0]); 
    ModifyArray(ref arr1); 
    Console.WriteLine("{0}", arr1[0]); 
} 

static void ModifyArray(ref int[] arr1) 
{ 
    arr1[0] = 20; 
    arr1 = new int[5] { -3, -1, -2, -3, -4 }; 
    Console.WriteLine("{0}", arr1[0]); 
} 
+0

雖然現在該方法的第一行是無用的,因爲您之後分配了一個新數組。 –

+0

@TimSchmelter從方法本身的角度來看,它可能會做些什麼,因爲您可能有多個對該數組的引用,並且只有傳遞給該方法的一個將被更改。例如,如果在調用'ModifyArray()'之前,你做了'var arr2 = arr1;',然後在調用之後你做了'Console.WriteLine(arr2 [0]);' - 這會打印'20'。 –

+0

真實,好點 –