2013-10-08 3 views
1

Поскольку окна телефон не имеет System.Runtime.Serialization.Formatters.Binary пространства имен, я использую следующий образ:глубокой копия типа значения неровного массив без сериализации

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

Но я не уверен в том, это сделает глубокую копию или нет (хотя вопрос this предполагает, что я сделаю глубокую копию, но мое подозрение связано с тем, что я использую зубчатый массив для достижения цели)

+0

Привет и добро пожаловать на SO! Не включайте теги в заголовок. Я отредактировал ваш заголовок соответственно. – tnw

ответ

4

Это делает только мелкую копию. Чтобы сделать глубокую копию, вы хотите что-то вроде:

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

Из документов для Array.Clone:

Создает неполную копию массива.

...

Мелкая копия массива копий только элементы массива, являются ли они ссылочные типы или типы значений, но не копирует объекты, ссылки относятся к. Ссылки в новом массиве указывают на те же объекты, на которые указывают ссылки в исходном массиве.

+0

Мой самый первый вопрос, на который ответил легенда сам @jon Skeet! Благодаря! Большой вентилятор: D –

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

Печать вместо .

Вы можете сделать реальный глубокий клон с помощью 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(); 
+0

Не «глубокая копия внешнего массива» только «мелкая копия»? –

+0

Большое спасибо, очень ценю вашу помощь! –

Смежные вопросы