由于数组参数是在没有引用关键字的情况下传递的,因此此代码输出数组的初始值(即 1...6):
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
var arr = new int[] {1, 2, 3, 4, 5, 6};
Rotate(arr, 3);
Console.WriteLine(string.Join(',', arr));
}
static void Rotate(int[] nums, int k)
{
var tail = nums.TakeLast(k).ToArray();
nums = tail.Concat(nums)
.Take(nums.Length)
.ToArray();
}
}
很明显,因为在 Rotate 方法内部有它自己的带有值的数组,从参数值复制而来。如果我想改变调用方法中的 arr 值,我需要通过 ref 将它传递给 Rotate 方法,它可以工作。但我不明白,为什么如果用 CopyTo() 方法替换赋值,参数的行为就像它通过引用传递一样:
static void Rotate(int[] nums, int k)
{
var tail = nums.TakeLast(k).ToArray();
tail.Concat(nums)
.Take(nums.Length)
.ToArray()
.CopyTo(nums, 0);
}