1

由于 windows phone 没有 System.Runtime.Serialization.Formatters.Binary 命名空间,我使用以下方式:

bool[][] newMask = (bool[][])this.mask.Clone();

但是我不确定这是否会进行深层复制(尽管这个问题表明我会进行深层复制,但我的怀疑在于我出于性能目的使用了锯齿状数组)

4

2 回答 2

4

那只会做一个浅拷贝。要制作深层副本,您需要以下内容:

bool[][] newMask = new bool[mask.Length][];
for (int i = 0; i < newMask.Length; i++)
{
    newMask[i] = (bool[]) mask[i].Clone();
}

从文档中Array.Clone

创建 Array 的浅表副本。

...

Array 的浅拷贝只复制 Array 的元素,无论它们是引用类型还是值类型,但它不复制引用所引用的对象。新 Array 中的引用指向的对象与原始 Array 中的引用指向的对象相同。

于 2013-10-08T15:59:43.340 回答
1

它不会进行深层复制。或者更准确地说,它只会对外部数组进行深拷贝。但是因为你有一个数组数组(并且数组是一个引用类型),对内部数组的引用将被复制到新的外部数组。

证明

var source = new int[1][];
source[0] = new int[2];
source[0][0] = 0;
source[0][1] = 1;

var copy = (int[][])source.Clone();

copy[0][0] = 2;
Console.WriteLine(source[0][0]);

打印2而不是0

您可以使用 LINQ 进行真正的深度克隆:

// without Clone() method
var copy = source.Select(x => x.ToArray()).ToArray();

// or with Clone() method
var copy = source.Select(x => (int[])x.Clone()).ToArray();
于 2013-10-08T16:04:01.810 回答