当涉及到克隆列表时,我在使用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;
}
}谢谢你让我明白我的错误。
发布于 2018-09-22 14:23:27
查看一下文献资料
MemberwiseClone方法通过创建一个新对象创建一个浅拷贝,然后将当前对象的非静态字段复制到新对象。如果字段是值类型,则执行字段的逐位复制。如果字段是引用类型,则复制引用,但引用对象不是;因此,原始对象及其克隆引用引用指向同一个对象。
因此,MemberwiseClone不会创建原始对象的深层副本,从而使原始对象和克隆对象引用相同的列表。
https://stackoverflow.com/questions/52457510
复制相似问题