Array.sort函数影响我认为不应该影响的数组

时间:2013-12-23 21:21:29

标签: c# arrays

(简体)代码:

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];
}

5 个答案:

答案 0 :(得分:2)

这是因为你正在处理引用类型。 TemporaryArrayX指向/是对内存中相同位置的引用。在任何地方使用其中一个引用来修改集合中的某些值,您将更改相同的数据。如果你想修改相同数据的不同版本,那么你应该做类似的事情;

        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);

现在ab是两个不同的数组。你对其中一个做的不会影响另一个。但请注意,如果您有一些引用类型的数组,则两个数组将包含引用的副本。因此,修改数组项的属性将在两个数组中修改它。

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"