我有一個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?
我有一個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?
該陣列由一個引用傳遞,則可以通過從另一方法內做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;
}
我認爲所有陣列都通過引用在C#傳遞
實際上(原始數組對象的引用由值傳遞),這是通常的行爲中引用類型的情況下,在C# 。
你的理解是部分正確,參考被傳遞,而是由值,這意味着一個新的參考被創建,其指向原始陣列對象A
通過。
的fun(int[] A)
有它的參考自己的副本,其指向包含1,2,3並在fun
您創建一個新的數組對象B
數組對象,你只是分配一個新的以參考您當地的方法參考變量當然不會對作爲輸入傳遞給fun
的原始對象A
產生任何影響。
如果您想反映對fun
中的A
所做的更改以反映回原始數組對象,則需要通過引用來傳遞它。
您可以更新數組項沒有通過引用傳遞這是在Scott Chamberlain's answer
解釋也希望它可以幫助!
你必須修改原來的引用,你永遠不會做。請參閱[文檔](https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/passing-reference-type-parameters#passing-reference-types-by-值) – maccettura
數組的元素通過引用傳遞,而不是數組本身。請參閱:https://stackoverflow.com/questions/967402/are-arrays-or-lists-passed-by-default-by-reference-in-c –
當製作例子,你不應該在多個地方使用相同的名稱,它使得很難談論你的例子,參數的名稱和傳入函數的變量名應該是兩個不同的名稱,以使這個例子更容易討論。 –