尝试添加ref
到参数声明,这现在应该按照您预期的方式工作。
不ref
调用 toArray.Resize
只能修改本地数组引用,而不能修改从 传入的引用Main
。
static void Main(string[] args)
{
string str = "Hello";
var array = str.ToArray();
PrintReverse(ref array);
Console.Read();
Debug.Assert(array.Length == 0);
}
static void PrintReverse(ref char[] Chars)
{
Console.Write(Chars[Chars.Length - 1]);
Array.Resize(ref Chars, Chars.Length - 1);
if (Chars.Length == 0) return;
PrintReverse(ref Chars);
}
编辑:
我误认为 ref 导致了浅克隆,这就是证明:
static void Main(string[] args)
{
var array = new[] { new object() };
TestRef(ref array, array);
}
static void TestRef(ref object[] arrayByRef, object[] arrayByValue)
{
Debug.Assert(ReferenceEquals(arrayByRef, arrayByValue)); //no difference whether passed by ref or value, if there was a shallow clone happening, this would fail
Array.Resize(ref arrayByRef, 2);
Debug.Assert(!ReferenceEquals(arrayByRef, arrayByValue)); //only now do they differ
}