深度复制值类型jagged Array而不进行序列化

时间:2013-10-08 15:57:01

标签: c# arrays serialization windows-phone-8 deep-copy

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

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

但我不确定这是否会成为一个深层副本(虽然this问题表明我会做一个深层复制但我怀疑的事实是我使用锯齿状数组用于性能目的)

2 个答案:

答案 0 :(得分: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的元素,无论它们是引用类型还是值类型,但它不会复制引用引用的对象。新数组中的引用指向与原始数组中的引用指向的相同对象。

答案 1 :(得分: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();