管理列表项的困难

本文关键字:列表 管理 | 更新日期: 2023-09-27 18:16:42

我真的不知道这些东西是如何在内存/处理器中发生的。

我创建了一个名为Block的类,它具有位置。我也有一个List<Block>来存储我的块。

首先,我在列表中添加一个Block:

blocks.Add(new Block());

然后,我想克隆那个块,这样我就有了两个独立的块,它们在我的列表中有不同的位置:

Block clonedBlock = blocks[0];
blocks.Add(clonedBlock);

但是当我改变新创建块的位置时,我也改变了第一个块的位置。

为什么它会这样做,有没有办法防止这种情况发生?

顺便说一下,我注意到列表似乎有一些奇怪的行为。例如在本例中:

List<Block> list01 = new List<Block>();
[... add some blocks to that list ...]
List<Block> list02 = list01; // also tried: List<Block> list02 = list01.ToList();
[... change item in list01 ...] --> also changes that item in list02

这让我猜测列表只包含类似指针的东西,当我试图"克隆"一个块时,我只复制指针,但其指向的位置保持不变。同样的问题:有什么办法可以预防吗?

编辑:解决方案:Object.MemberwiseClone()- Method

管理列表项的困难

你的猜测基本正确。类是引用类型,所以你的Block clonedBlock = blocks[0];将clonedBlock设置为与blocks[0]相同的地址。对其中一个所做的任何更改都将反映在另一个中。你最好创建一个Block的新实例并将其添加到列表中,除非有一些原因你想复制另一个Block并简单地改变它的位置。

处理这个问题的一种方法是实现深度复制(我认为这是术语-我已经好几年没有在c++中做任何事情了)。创建一个Block的新实例,然后将原实例中的值复制到新实例中。

你可以考虑实现iclonable,或者简单地编写自己的复制方法(实际上,如果你实现了iclonable,你仍然在编写自己的复制方法-接口只是确保使用它的类实现Clone方法。深或浅取决于实现者)。

还要看一下对象。MemberwiseClone方法。Object.MemberwiseClone进行浅复制,但是在示例部分中有一个同时进行浅复制和深复制的示例。