[英]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.