C # клонирование ICloneable объекта, содержащего список - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть проблема при использовании моего класса ICloneable, когда дело доходит до клонирования списков:

class MetroBoards : ICloneable
{
    public int Iteration;
    public List<int[]> MetroPieces = new List<int[]>();
    public List<char> MetroPiecesDefinition = new List<char>();

    public object Clone()
    {
        return this.MemberwiseClone();
    }
}

При попытке обновить список в клоне сделано так:

MetroBoards NewBoard = new MetroBoards();
NewBoard = (MetroBoards)ChosenBoard.Clone();
NewBoard.MetroPieces[MoveOne] = Coordinates;

И так:

MetroBoards (MetroBoards)ChosenBoard.Clone();
NewBoard.MetroPieces[MoveOne] = Coordinates;

Где MoveOne - целое число, а координаты - int [].Когда я обновляю список в моем клоне, он обновляет и клон, и базу.

Насколько я понял, "MemberwiseClone" должен предоставить мне глубокую копию, которая должна создать новый объект с копиямиего свойства, которые не должны быть связаны с новым объектом.

РЕДАКТИРОВАТЬ

Благодаря комментариям я перечитал документацию и изменил процесс клонирования следующим образом:

class MetroBoards : ICloneable
{
    public int Iteration;
    public List<int[]> MetroPieces = new List<int[]>();
    public List<char> MetroPiecesDefinition = new List<char>();

    public object Clone()
    {
        MetroBoards ThisBoard = (MetroBoards)this.MemberwiseClone();
        ThisBoard.MetroPieces = new List<int[]>();
        foreach (int[] Piece in this.MetroPieces)
        {
            int[] temp = new int[2];
            temp[0] = Piece[0];
            temp[1] = Piece[1];
            ThisBoard.MetroPieces.Add(temp);
        }
        return ThisBoard;
    }
}

Спасибо, что дали мне понять мою ошибку.

1 Ответ

0 голосов
/ 22 сентября 2018

Ознакомьтесь с документацией :

Метод MemberwiseClone создает поверхностную копию путем создания нового объекта, а затем копирует нестатические поля текущего объекта вновый объект.Если поле является типом значения, выполняется побитовая копия поля. Если поле является ссылочным типом, ссылка копируется, а ссылочный объект - нет;следовательно, исходный объект и его клон ссылаются на один и тот же объект.

Таким образом, MemberwiseClone не создает глубокую копию исходного объекта, оставляя ссылку на исходный объект и клонированный объекттот же список.

...