阵列深拷贝 [英] Deep Copy with Array

查看:78
本文介绍了阵列深拷贝的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么 ICloneable Clone 方法不返回深层副本?

Why doesn't ICloneable's Clone method return a deep copy?

下面是一些示例代码:

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

记住我只更改了 Array2 中的元素索引2 ,这是上面代码的输出,列出了 Array1 中的值:

Remembering that I've only changed element index 2 in Array2, here is the output from the code above, listing the values in Array1:

Index 0 value: 0
Index 1 value: 1
Index 2 value: 11
Index 3 value: 3

Array1 中的索引2具有 11 ,即使我在中进行了更改Array2 和类 A 实现 ICloneable

Index 2 in Array1 has 11 even though I changed it in Array2 and class A implements ICloneable!

Array 实现 ICloneable 的好处是什么?

推荐答案

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

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

"If sourceArray and destinationArray are both reference-type arrays or are both arrays of type Object, a shallow copy is performed. A shallow copy of an Array is a new Array containing references to the same elements as the original Array. The elements themselves or anything referenced by the elements are not copied"

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

There may be a better method than this, but one technique you could use is:

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

这篇关于阵列深拷贝的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆