我有一个包含两个方法的类,一个是QuickSort()和一个ReverseArray()。当我传入数组时,它首先调用QuickSort(),然后调用ReverseArray(),但是当它到达ReverseArray()时,它会从QuickSort()反转已排序的数组,而不是反转所创建的原始数组。我究竟做错了什么?任何建议都将不胜感激。
public class Program
{
private readonly int[] ProgramArray = new int[10] ;
public Program(int[] array)
{
ProgramArray = array;
QuickSort();
ReverseArray();
}
public void QuickSort()
{
var newarray = new int[10];
newarray = ProgramArray;
Array.Sort(newarray);
Print(newarray, "QuickSort");
}
public void ReverseArray()
{
var newarray = new int[10];
newarray = ProgramArray;
Array.Reverse(newarray);
Print(newarray, "Reversed");
}
public static void Print(int[] array, string methodname)
{
int[] newarray = array;
Console.Write(string.Format("{0}: ", methodname));
for (int i = 0; i < newarray.Length; i++)
{
Console.Write(newarray[i] + " ");
}
Console.Write("\n");
}
static void Main(string[] args)
{
var array = new int[10] { 12, 24, 3, 44, 5, 16, 7, 34, 23, 34 };
var program = new Program(array);
}
答案 0 :(得分:4)
数组是引用类型。您正在整个代码库中处理相同的引用。
如果您想要数组的副本,则需要复制它。
此处,newarray
不是数组的副本,而是引用到ProgramArray
的副本:
newarray = ProgramArray;
使用Array
上定义的Copy
方法创建副本:
Array.Copy(ProgramArray, newarray, ProgramArray.Length);
另外,我建议阅读value types and reference types之间的差异。
答案 1 :(得分:1)
在.NET中,数组是引用类型。在QuickSort中,“newarray = ProgramArray”行将newArray引用设置为与ProgramArray相同的实例。所以Array.Sort实际上是在ProgramArray上运行的。同样,在ReverseArray中,Array.Reverse也在ProgramArray上运行。如果要复制数组,请使用克隆()。
答案 2 :(得分:1)
Array是一种对象引用类型,因此语句newarray = ProgramArray;
会导致newArray
引用与ProgramArray
相同的数组。为避免这种情况,您必须复制数组。
答案 3 :(得分:1)
请尝试使用以下代码。将一个数组分配给另一个数组时,您不会克隆或处理所有元素。您正在分配数组开头部分的内存地址。换句话说,您只是将引用变量分配给另一个数组。 I.E.所有数组变量都指向相同的地址空间,因此即使使用不同的变量名,也要修改相同的数组。
public class Program
{
private readonly int[] ProgramArray = new int[10];
public Program(int[] array)
{
ProgramArray = array;
QuickSort();
ReverseArray();
}
public void QuickSort()
{
var newarray = new int[10];
newarray = (int[])ProgramArray.Clone();
Array.Sort(newarray);
Print(newarray, "QuickSort");
}
public void ReverseArray()
{
var newarray = new int[10];
newarray = (int[])ProgramArray.Clone();
Array.Reverse(newarray);
Print(newarray, "Reversed");
}
public static void Print(int[] array, string methodname)
{
int[] newarray = array;
Console.Write(string.Format("{0}: ", methodname));
for (int i = 0; i < newarray.Length; i++)
{
Console.Write(newarray[i] + " ");
}
Console.Write("\n");
}
static void Main(string[] args)
{
var array = new int[10] { 12, 24, 3, 44, 5, 16, 7, 34, 23, 34 };
Print(array, "Original Array");
var program = new Program(array);
Console.ReadKey();
}
}
答案 4 :(得分:1)
除了其他人告诉你的关于引用类型的内容之外,我建议你将数组作为参数传递给排序方法,而不是使用全局数组ProgramArray
。这使得更容易理解信息流。
public void QuickSort(int[] array)
{
// Easiest way to get a copy of the array
var newArray = (int[])array.Clone();
...
}
public void ReverseArray(int[] array)
{
var newArray = (int[])array.Clone();
...
}
public Program(int[] array)
{
QuickSort(array);
ReverseArray(array);
}