C#数组参数引用

时间:2017-07-28 20:30:31

标签: c# arrays

我有一个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?

2 个答案:

答案 0 :(得分:1)

  

我认为所有数组都是通过C#

中的引用传递的

实际上(原始数组对象的引用按值传递),这是C#中引用类型的常见行为。

您的理解是部分正确的,传递引用但是通过值传递,这意味着创建了一个指向原始数组对象A的新引用。

fun(int[] A)拥有自己的引用副本,该副本指向包含 1,2,3 的数组对象,并在您创建的fun中一个新的数组对象B,您只是将新的引用分配给本地方法引用变量,当然这对原始A对象没有任何影响,该对象作为输入传递给fun

如果要反映对Afun所做的更改以反映回原始数组对象,则需要通过引用传递它。

您可以更新数组项而不通过引用传递,这在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;
}