[英]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.