为什么这个对象在浅层复制后不是null

本文关键字:复制 null 对象 为什么 | 更新日期: 2023-09-27 18:30:11

下面是我的配偶到客户端的副本(两者都是相同的对象类型)。然后将"配偶"设置为null。

client = spouse; // Copying data
spouse = null;

然后我暂停(在另一行使用断点),检查客户和配偶的内存。配偶是无效的,但客户不是。

客户端不应该为null,因为它的内存是浅拷贝的结果吗?

干杯

为什么这个对象在浅层复制后不是null

您的配偶住在芝麻街123号。

你在一张纸上写下:配偶:芝麻街123号。

现在你在另一张纸上写下:客户:。然后你在第一张纸上抄下它说的话。

现在你有两张纸。其中一条写着"SPOUSE:123 Sesame Street"。另一个写着"客户:芝麻街123号"。

现在,您可以擦除页面上写着SPOUSE的地址。

上面写着CLIENT的页面现在写着什么?


从你选择的术语中可以明显看出你的困惑。

不要说"做一个肤浅的复制品"。说"复制参考资料",因为这就是你要做的。"浅"是相对的,不说相对于什么。说出实际发生的情况:值正在被复制,该值是一个引用

不要说"此对象为空"。这就像在说"我车道上的车不在那里";这是荒谬的。变量可以包含空引用。引用可以是空引用

当你使你的语言精确时,这些困惑就会迅速消失。

这不会发生,因为您正在更改指针的值,而不是对象本身。

让我们想象一下这个场景:

var spouse = new Person(); //Let's say the memory address of this new person is 0x000010

现在,我们有了这个:

Person client = null; //The pointer of client now points to 0x000000
client = spouse;      //The pointer of client now points to 0x000010
spouse = null;        //The pointer of spouse now points to 0x000000
                      //However - client has *not* changed, it still points to 0x000010
                      //and the object still remains in memory.

在C#中,Shallow复制的方法不是正确的。C#为我们提供了一个可以用来执行浅拷贝的函数。函数为CCD_ 1。

试试这个

Client = Spouse.MemberwiseClone();

如果它对你不起作用,请告诉我。欢呼