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;
您将数组 input
的 reference 复制到 inputnew 的 reference。这就是面向对象编程的工作方式。你总是有对象的引用。这就是为什么这些类型也被称为 Reference Type 的原因。另一方面,你有值类型,它实际上复制了值,比如int
和boolean
.
如果你想复制数组的实际值,你必须像这样使用函数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做一个输入过程会参考将其作为依赖列表。如果你不想被这个过程影响,你应该看看克隆锥。
我不明白为什么要倒转第二个数组,也反转第一个数组...感谢谁能解释为什么。
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;
您将数组 input
的 reference 复制到 inputnew 的 reference。这就是面向对象编程的工作方式。你总是有对象的引用。这就是为什么这些类型也被称为 Reference Type 的原因。另一方面,你有值类型,它实际上复制了值,比如int
和boolean
.
如果你想复制数组的实际值,你必须像这样使用函数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做一个输入过程会参考将其作为依赖列表。如果你不想被这个过程影响,你应该看看克隆锥。