(简体)代码:
Line 1 Temporary = ArrayX;
Line 2 Array.Sort(Temporary, ArrayY);
我通过逐步执行代码录制了以下结果:
第1行之前:
Array X = 3, 2, 1
Array Y = 1, 2, 3
Temporary = 0 ,0 ,0
第2行之前:
Array X = 3, 2, 1
Array Y = 1, 2, 3
Temporary = 3, 2, 1
(到目前为止一直很好)
第3行之后:
Array X = 1, 2, 3 //<-- Why is this affected by Line 2??
Array Y = 3, 2, 1
Temporary = 1, 2, 3
如您所见,无论出于何种原因ArrayX
受排序功能的影响。老实说,我看不出它应该是什么原因。
编辑 - 所以应该这样吗?这看起来有点笨拙。
for (int i =0; i<3; i++)
{
Temporary[i] = ArrayX[i];
}
答案 0 :(得分:2)
这是因为你正在处理引用类型。 Temporary
和ArrayX
指向/是对内存中相同位置的引用。在任何地方使用其中一个引用来修改集合中的某些值,您将更改相同的数据。如果你想修改相同数据的不同版本,那么你应该做类似的事情;
var temp = ArrayX.ToList();
哪个会返回List<T>
,其中T
是数组的类型(T[]
)。如果您执行排序temp
之类的操作,则会对副本进行排序,ArrayX
将保持不变。
答案 1 :(得分:1)
因为您正在执行Temporary = ArrayX
并且您正在为他们提供相同的参考。
答案 2 :(得分:1)
Temporary和ArrayX都指向内存中的相同位置。它们只是两个相同的名字。因此,如果你换一个,其他的就会改变。
答案 3 :(得分:1)
数组是引用类型,这就是它们引用相同内存位置的原因。如果你换一个,第二个也会受到影响。
答案 4 :(得分:0)
数组是引用类型。将数组变量分配给另一个不会创建数组的副本,而只会创建数组引用的副本。你可以像这样复制数组
int[] a = { 2, 5, 2 };
int[] b = new int[a.Length];
Array.Copy(a, b, a.Length);
现在a
和b
是两个不同的数组。你对其中一个做的不会影响另一个。但请注意,如果您有一些引用类型的数组,则两个数组将包含引用的副本。因此,修改数组项的属性将在两个数组中修改它。
class Person
{
string Name { get; set; }
}
和
Person[] a = {
new Person{ Name = "John"}, new Person{ Name = "Sue"}, new Person{ Name = "Pete"}
};
Person[] b = new Person[a.Length];
Array.Copy(a, b, a.Length);
现在,排序数组b
不会修改数组a
。但是修改一个数组中的人也会在另一个数组中修改它:
a[1].Name = "Jill";
Console.WriteLine(b[1].Name); // ==> "Jill"