我试图准确理解下面这段代码中发生的事情:
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
想象一下a、b、 和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关键字基本上告诉它传递“盒子”本身。请参阅文档以获取更多信息。