簡體   English   中英

深度復制值類型鋸齒狀數組而不進行序列化

[英]deep copy a value type jagged Array without serialization

由於Windows Phone沒有System.Runtime.Serialization.Formatters.Binary命名空間,因此我使用以下方式:

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

但是我不確定是否會進行深層復制(盡管這個問題表明我會進行深層復制,但是我懷疑我是出於性能目的使用鋸齒狀陣列這一事實)

那只能做一個淺表的復制。 要進行深拷貝,您需要以下內容:

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是引用類型),所以對內部數組的引用將被復制到新的外部數組。

證明

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM