带阵列的深层复制

时间:2010-08-12 03:52:51

标签: c# arrays

让我们有这个代码:

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

在主要方法中:

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(Array1[i].x); 

输出:

0

1

11

3

虽然A级实现了IClonable ...... !! 那么..实现IClonable In Array有什么好处?

4 个答案:

答案 0 :(得分:6)

来自http://msdn.microsoft.com/en-us/library/k4yx47a1.aspx

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

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

  A[] array2 = array1.Select (a =>(A)a.Clone()).ToArray();

答案 1 :(得分:2)

Array.Copy复制数组的值,在本例中为reference。 Array.Copy()的文档中没有任何内容表明检查实现IClonable的类并调用Clone()。您将需要遍历数组并自己调用Clone()。

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

Ani的回答使用LINQ因此不适用于C#2.0,但使用ArrayConvertAll方法可以使用相同的方法:< / p>

A[] Array2 = Array.ConvertAll(Array1,a => (A)a.Clone());