我有一个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 :(得分:1)
我认为所有数组都是通过C#
中的引用传递的
实际上(原始数组对象的引用按值传递),这是C#中引用类型的常见行为。
您的理解是部分正确的,传递引用但是通过值传递,这意味着创建了一个指向原始数组对象A
的新引用。
fun(int[] A)
拥有自己的引用副本,该副本指向包含 1,2,3 的数组对象,并在您创建的fun
中一个新的数组对象B
,您只是将新的引用分配给本地方法引用变量,当然这对原始A
对象没有任何影响,该对象作为输入传递给fun
。
如果要反映对A
中fun
所做的更改以反映回原始数组对象,则需要通过引用传递它。
您可以更新数组项而不通过引用传递,这在Scott Chamberlain's answer
中有详细解释希望它有帮助!
答案 1 :(得分: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;
}