2017-07-28 233 views
0

我有一個C#代碼如下:C#數組參數參考

int[] A = new int[] {1, 2, 3}; 
fun(A); 
// A at this point still says 1, 2, 3. 

void fun(int[] A) 
{ 
    int[] B = new int[] {4, 5, 6}; 
    A = B; 
} 

我以爲所有陣列由在C#引用傳遞。撥打fun()後不應該反映4,5,6?

+0

你必須修改原來的引用,你永遠不會做。請參閱[文檔](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/passing-reference-type-parameters#passing-reference-types-by-值) – maccettura

+4

數組的元素通過引用傳遞,而不是數組本身。請參閱:https://stackoverflow.com/questions/967402/are-arrays-or-lists-passed-by-default-by-reference-in-c –

+0

當製作例子,你不應該在多個地方使用相同的名稱,它使得很難談論你的例子,參數的名稱和傳入函數的變量名應該是兩個不同的名稱,以使這個例子更容易討論。 –

回答

1

該陣列由一個引用傳遞,則可以通過從另一方法內做A[0] = 7;看到這一點。

即參考(由外可變A保持),但是通過值傳遞給函數。該引用被複制並創建一個新變量並傳遞給該函數。函數外部的變量不受函數內部參數變量A的重新分配影響。

要更新您需要使用ref關鍵字,因此函數內的參數表示相同的對象功能以外的原始變量。

int[] A = new int[] {1, 2, 3}; 
fun2(A); 
// A at this point says 7, 2, 3. 
fun(ref A); 
// A at this point says 4, 5, 6. 

void fun2(int[] a) 
{ 
    a[0] = 7; 
} 

void fun(ref int[] a) 
{ 
    int[] B = new int[] {4, 5, 6}; 
    a = B; 
} 
+0

'這個數組是通過引用傳遞的,不,它是按值傳遞的,從OP的代碼中可以看出。如果該陳述是真實的,那麼OP的代碼將完成他們期望的代碼,而不是實際執行的代碼。 – Servy

+0

@Servy做了一些改編 –

+0

現在這句話沒有意義。你的意思是說數組傳遞*是*引用,而不是*引用? – Servy

1

我認爲所有陣列都通過引用在C#傳遞

實際上(原始數組對象的引用由值傳遞),這是通常的行爲中引用類型的情況下,在C# 。

你的理解是部分正確,參考被傳遞,而是由值,這意味着一個新的參考被創建,其指向原始陣列對象A通過。

fun(int[] A)有它的參考自己的副本,其指向包含1,2,3並在fun您創建一個新的數組對象B數組對象,你只是分配一個新的以參考您當地的方法參考變量當然不會對作爲輸入傳遞給fun的原始對象A產生任何影響。

如果您想反映對fun中的A所做的更改以反映回原始數組對象,則需要通過引用來傳遞它。

您可以更新數組項沒有通過引用傳遞這是在Scott Chamberlain's answer

解釋也希望它可以幫助!

+0

所以你說數組是通過引用傳遞的,然後*在同一個句子*中,說它們是按值傳遞的。不,數組*不通過引用傳遞,所以不要說它們是。 – Servy

+0

原始數組對象的引用通過值 –

+0

@Yes傳遞,這是正確的,不像回答中的粗體語句,即數組通過引用傳遞,這是錯誤的。 – Servy