C# 带数组的深度复制

C# 带数组的深度复制,c#,arrays,C#,Arrays,为什么ICloneable的Clone方法不返回深度拷贝 以下是一些示例代码: class A : ICloneable { public int x = 2; public A(int x) { this.x = x; } public A copy() { A a = new A(this.x); return a; } public object Clon

为什么
ICloneable
Clone
方法不返回深度拷贝

以下是一些示例代码:

class A : ICloneable 
{
    public int x = 2;
    public A(int x)
    {
       this.x = x; 
    }
       
    public A copy()
    {
        A a = new A(this.x);
        return a; 
    }

     public object Clone()
     {
         A a = new A(this.x);
         return a;
     }
}
Main
方法中:

A[] Array1 = new A[4] ;
Array1[0] = new A(0);
Array1[1] = new A(1);
Array1[2] = new A(2);
Array1[3] = new A(3);
A[] Array2 = new A[10];
Array. Copy(Array1, Array2, 4); 

Array2[2].x = 11; 
for (int i = 0; i < 4; i++)
    Console.WriteLine($"Index {i} value: {Array1[i].x}");
Array1
中的索引2具有
11
,即使我在
Array2
中更改了它,并且类
A
实现了
ICloneable


那么
Array
实现
ICloneable
有什么好处呢?

Array.Copy复制数组的值,在本例中是引用。Array.Copy()的文档中没有任何内容指示检查实现IClonable的类,而是调用Clone()。您需要在数组中循环并自己调用Clone()

顺便说一句,是的,IClonable有点糟糕。

Array.Copy()
不使用IClonable。它只是从以下位置复制存储在每个单元格中的值(在本例中是对A对象的引用)

如果sourceArray和destinationArray都是引用类型的数组或都是Object类型的数组,则执行浅层复制。数组的浅层复制是一个新数组,其中包含对与原始数组相同的元素的引用。元素本身或元素引用的任何内容都不会被复制

可能有比这更好的方法,但您可以使用的一种技术是:

  A[] array2 = array1.Select (a =>(A)a.Clone()).ToArray();
因此,Ani的答案不适用于C#2.0,但是可以使用类的方法执行相同的方法:


但在一般情况下需要注意的是:“ICloneable接口只要求Clone()方法的实现返回当前对象实例的副本。它不指定克隆操作是执行深度复制、浅层复制还是介于两者之间的操作。”
  A[] array2 = array1.Select (a =>(A)a.Clone()).ToArray();
A[] Array2 = Array.ConvertAll(Array1,a => (A)a.Clone());