在使用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;
}
}
谢谢你让我理解我的错误。
答案 0 :(得分:0)
MemberwiseClone方法通过创建新对象,然后将当前对象的非静态字段复制到新对象来创建浅表副本。如果字段是值类型,则将执行该字段的逐位复制。 如果字段是引用类型,则将复制引用,但不会复制引用的对象;因此,原始对象及其克隆引用相同的对象。
因此,MemberwiseClone
不会创建原始对象的深层副本,而使原始对象和克隆的对象引用同一列表。