C#克隆包含List的ICloneable对象

时间:2018-09-22 14:17:44

标签: c# list cloning

在使用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 :(得分:0)

看看the documentation

  

MemberwiseClone方法通过创建新对象,然后将当前对象的非静态字段复制到新对象来创建浅表副本。如果字段是值类型,则将执行该字段的逐位复制。 如果字段是引用类型,则将复制引用,但不会复制引用的对象;因此,原始对象及其克隆引用相同的对象。

因此,MemberwiseClone不会创建原始对象的深层副本,而使原始对象和克隆的对象引用同一列表。