Array.reverse 反转当前数组并初始化数组,但为什么呢?

Array.reverse reverses both current array and initial array but why?

我不明白为什么要倒转第二个数组,也反转第一个数组...感谢谁能解释为什么。

char[] input = { 'h', 'e', 'l', 'l', 'o' };
char[] inputnew = input;     
Array.Reverse(inputnew);
Console.WriteLine(new string(input));
Console.WriteLine(new string(inputnew));

输出: 欧莱 欧莱

这是因为 = 不会创建数组的 copy,而是您有两个引用指向 非常相同的数组.

换句话说,有一个数组有两个指向它的引用。

第一个数组(input)内存地址指向第二个数组(inputnew),所以,任何一个地方都是变化的使两个变量生效。

因为,两个变量指向同一个内存地址。

引用类型总是指向内存地址。值类型总是指向值

更多详情http://net-informations.com/faq/general/valuetype-referencetype.htm

这一行:

char[] inputnew = input;  

您将数组 inputreference 复制到 inputnew 的 reference。这就是面向对象编程的工作方式。你总是有对象的引用。这就是为什么这些类型也被称为 Reference Type 的原因。另一方面,你有值类型,它实际上复制了,比如intboolean.

如果你想复制数组的实际值,你必须像这样使用函数Array.Copy(sourceArray, TargetArray)

char[] input = { 'h', 'e', 'l', 'l', 'o' };
char[] inputnew;     

Array.Copy(input, inputNew);    

Array.Reverse(inputnew);
Console.WriteLine(new string(input));
Console.WriteLine(new string(inputnew));

在 C# 中,数组是通过引用传递的。 inputnew 和 input 在分配时具有相同的索引。

如果您不想通过引用传递:

char[] inputnew = input.copyTo();

会完成这项工作。

嗯,唯一可能的答案——也可能是正确的答案——是你实际上并没有复制数组。当你写

char[] inputnew = 输入; 您正在将对同一数组的引用分配给另一个变量。换句话说,它们都指向同一个对象。

这是因为你在

的时候没有赋值
char[] inputnew = input;

你正在做的是将 inputnew 指向内存中 { 'h', 'e', 'l', 'l', 'o' }; 的位置。

因此,您将获得相同的输出。

P.s。尝试先初始化 inputnew 数组然后赋值,看看会发生什么。

要创建一个新数组,您应该使用 Array.Copy 方法, 你现在拥有它的方式是 inputNew 只是对输入数组的引用。

您的代码应如下所示:

        char[] input = { 'h', 'e', 'l', 'l', 'o' };
        char[] inputnew = new char[input.Length];
        Array.Copy(input, inputnew, input.Length);
        Array.Reverse(inputnew);
        Console.WriteLine(new string(input));
        Console.WriteLine(new string(inputnew));

您遇到此问题是因为内存类型的行为。事实上,我建议您查看 ValueType 和引用类型主题。其实char[] inputnew = input;在这个阶段,你看的是input的inputnew(C++指针),所以如果你想对inputnew做一个输入过程会参考将其作为依赖列表。如果你不想被这个过程影响,你应该看看克隆锥。

look here