首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#克隆包含列表的ICloneable对象

C#克隆包含列表的ICloneable对象
EN

Stack Overflow用户
提问于 2018-09-22 14:17:43
回答 1查看 758关注 0票数 1

当涉及到克隆列表时,我在使用ICloneable类时遇到了一个问题:

代码语言:javascript
复制
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();
    }
}

在试图更新克隆中的列表时,采用了以下两种方式:

代码语言:javascript
复制
MetroBoards NewBoard = new MetroBoards();
NewBoard = (MetroBoards)ChosenBoard.Clone();
NewBoard.MetroPieces[MoveOne] = Coordinates;

这样:

代码语言:javascript
复制
MetroBoards (MetroBoards)ChosenBoard.Clone();
NewBoard.MetroPieces[MoveOne] = Coordinates;

其中MoveOne是整数,协调器是int[]。当我更新我的克隆中的列表时,它同时更新了克隆和基。

据我所知,"MemberwiseClone“应该为我提供一个深拷贝,它应该创建一个新的对象,它的属性的副本不应该与新对象相关联。

编辑

由于有了评论,我重新阅读了文档,并将克隆过程修改为:

代码语言:javascript
复制
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;
    }
}

谢谢你让我明白我的错误。

EN

回答 1

Stack Overflow用户

发布于 2018-09-22 14:23:27

查看一下文献资料

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52457510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档