我有一个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 –
当制作例子,你不应该在多个地方使用相同的名称,它使得很难谈论你的例子,参数的名称和传入函数的变量名应该是两个不同的名称,以使这个例子更容易讨论。 –