2010-08-12 39 views
2

让我们有这样的代码:深备份阵列

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

输出:

虽然A类实现IClonable ...! 然后..实现IClonable在数组中的好处是什么?

回答

6

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

“如果sourceArray和destinationArray都是参考型阵列或是Object类型的两个阵列,一个数组的浅拷贝是一个新的数组,其中包含与原始数组相同的元素的引用,元素本身或元素引用的任何数据都不会被复制“

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

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

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

顺便说一句,是的,IClonable种吸吮。

2

Array.Copy()不使用ICloneable。它简单地存储在每个单元的值复制(在这种情况下是到您的A对象的引用)

2

阿尼的答案使用LINQ从而为C#2.0不起作用,然而同样的方法可以使用Array类的ConvertAll方法来完成:

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