簡體   English   中英

C#克隆包含List的ICloneable對象

[英]C# Cloning an ICloneable object containing List

關於克隆列表,在使用我的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;
    }
}

謝謝您讓我理解我的錯誤。

看一下文檔

MemberwiseClone方法通過創建新對象,然后將當前對象的非靜態字段復制到新對象來創建淺表副本。 如果字段是值類型,則將執行該字段的逐位復制。 如果字段是引用類型,則引用被復制,但引用的對象不被復制; 因此,原始對象及其克隆引用相同的對象。

因此, MemberwiseClone不會創建原始對象的深層副本,而使原始對象和克隆對象引用同一列表。

暫無
暫無

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

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