C# 影响数组的Array.sort函数,我认为它不应该影响数组

C# 影响数组的Array.sort函数,我认为它不应该影响数组,c#,arrays,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

简化代码:

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

因为您正在执行的是Temporary=ArrayX,并且为它们提供了相同的引用。

因为您正在执行Temporary=ArrayX,并且为它们提供了相同的引用。

Temporary和ArrayX都指向内存中的相同位置。它们只是同一事物的两个名称。因此,如果您更改一个,另一个也会更改。

临时和数组都指向内存中的同一位置。它们只是同一事物的两个名称。因此,如果您更改一个,另一个也会更改。

这是因为您正在处理引用类型。Temporary和ArrayX指向/是对内存中相同位置的引用。无论您在何处使用这些引用之一来修改集合中的某些值,您都在更改相同的数据。如果您想要修改相同数据的不同版本,那么您应该执行以下操作:

        var temp = ArrayX.ToList();

它将返回一个列表,其中T是数组T[]的类型。如果然后执行类似sort temp的操作,它将对副本进行排序,而ArrayX将保持不变。

这是因为您处理的是引用类型。Temporary和ArrayX指向/是对内存中相同位置的引用。无论您在何处使用这些引用之一来修改集合中的某些值,您都在更改相同的数据。如果您想要修改相同数据的不同版本,那么您应该执行以下操作:

        var temp = ArrayX.ToList();

它将返回一个列表,其中T是数组T[]的类型。如果执行类似于sort temp的操作,它将对副本进行排序,而ArrayX将保持不变。

数组是引用类型,这就是它们引用相同内存位置的原因。如果更改一个,第二个也会受到影响

数组是引用类型,这就是它们引用相同内存位置的原因。如果更改一个,第二个也会受到影响

数组是引用类型。将数组变量分配给另一个变量不会创建数组的副本,而只创建数组引用的副本。可以像这样复制数组

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

现在,排序数组b不会修改数组a。但在一个数组中修改一个人也会在另一个数组中修改它:

a[1].Name = "Jill";
Console.WriteLine(b[1].Name); // ==> "Jill"

数组是引用类型。将数组变量分配给另一个变量不会创建数组的副本,而只创建数组引用的副本。可以像这样复制数组

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

现在,排序数组b不会修改数组a。但在一个数组中修改一个人也会在另一个数组中修改它:

a[1].Name = "Jill";
Console.WriteLine(b[1].Name); // ==> "Jill"

临时=ArrayX;不复制数组的内容。Temporary=ArrayX;不复制数组的内容。好的。那么,上述方案是否合理?看起来很笨拙。你需要的是一份深度拷贝。这取决于正在处理的数组的大小。我通常有一个使用MemoryStream的小方法和一个序列化和反序列化对象的二进制格式化程序。尽管如此,所有这些都取决于对象是什么以及它在应用程序中的使用方式。如果您的数组是值类型,那么CopyTo也可以工作。好的。谢谢你的帮助。回答埃文只是因为我相信他先到了那里。那么,上述方案是否合理?看起来很笨拙。你需要的是一份深度拷贝。这取决于正在处理的数组的大小。我通常有一个使用MemoryStream的小方法和一个序列化和反序列化对象的二进制格式化程序。尽管如此,所有这些都取决于对象是什么以及它在应用程序中的使用方式。如果您的数组是值类型,那么CopyTo也可以工作。好的。谢谢你的帮助。回答埃文只是因为我相信他先到了那里。