C# 中的数组复制语义

sca*_*ell -1 .net c# arrays

我试图准确理解下面这段代码中发生的事情:

static void someMethod(int[] a) {
    int[] b = new int[5];
    a = b;
}

static void Main(string[] args) {
    int[] arr = new int[10];
    someMethod(arr);
    Console.WriteLine(arr.Length);
}
Run Code Online (Sandbox Code Playgroud)

我无法解释的是为什么Console.Writeline()打印 10 而不是 5。 C# 中的数组是引用类型,所以我认为该行将a = b变量设置a为指向int[5]. 然而Console.Writeline() 打印 10。我无法解释数组的这种类似值类型的行为。有人可以解释一下吗?

小智 5

想象一下ab、 和arr等可以存储参考资料的盒子。

您将引用存储在arr. 您将引用而不是框本身传递给someMethod,它将将该引用粘贴到自己的框 中a

然后,您创建一个新对象并将对其的引用存储在b. 然后,您获取内部的引用b,并将其粘贴到内部a,替换对该框内传入数组的引用。

但这不会更改存储在 中的值arr,其中包含最初引用的对象。

但是,您可以修改引用的对象:

static void someMethod(int[] a) 
{
    a[2] = 10;
    a[3] = 7;
}

static void Main(string[] args) 
{
    int[] arr = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    someMethod(arr);
    Console.WriteLine(arr[2]);
}
Run Code Online (Sandbox Code Playgroud)

你会发现数组已经被修改了。

正如评论中所建议的,使用ref关键字基本上告诉它传递“盒子”本身。请参阅文档以获取更多信息。