Суть вашей проблемы здесь:
Там я храню эти значения в другом двумерном массиве
Это на самом деле неточно. Вы не создаете новый массив; вы устанавливаете для переменной originalValues
значение то же массив . Более подробное объяснение см. Ниже.
Путаница, выраженная в комментариях к ответу Питера , связана с некоторой неопределенностью, связанной с термином "глубокая копия".
Когда дело доходит до копирования объектов, существует глубокое копирование и поверхностное копирование.
Глубокое копирование включает создание копии всех данных, принадлежащих объекту, что означает, что если объект включает в себя элементы, которые сами являются сложными (например, экземпляры определенные ссылочные типы), эти объекты также должны быть глубоко скопированы (вместе со всеми их членами и т. д.).
Мелкое копирование включает в себя простое копирование всех полей из одного объекта в другой, что означает, что, если объект включает ссылочные типы, необходимо копировать только ссылки (и поэтому скопированные ссылки будут указывать к тем же объектам).
В случае кода, который вы разместили:
int[,] originalValues = this.Metrics;
... на самом деле вообще нет копирования объектов . Все, что вы сделали, это скопировали одну ссылку, присвоив значение this.Metrics
(ссылка) переменной originalValues
(также ссылка, на тот же массив). По сути, это то же самое, что и простое присвоение значений, например:
int x = y; // No objects being copied here.
Теперь метод Array.Clone
фактически создает мелкую копию. Но, как указал Питер, на самом деле нет никакой разницы между «мелкой» или «глубокой» копией массива целых чисел , поскольку целые числа не являются сложными объектами.
Если у вас было что-то вроде этого:
StringBuilder[,] builders = GetStringBuilders();
StringBuilder[,] builderCopies = (StringBuilder[,])builders.Clone();
... у вас получится целый новый массив (копия, да), но один, содержащий все те же StringBuilder
объекты (так что мелкая копия). Вот где в игру вступает глубокое, а не мелкое копирование; если вам нужен новый массив, содержащий копий всех StringBuilder
объектов из builders
, вам необходимо сделать глубокую копию.