为什么这个对象在浅拷贝后不为空?

Why isnt this object null after a shallow copy?

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

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

然后我暂停(在不同的行上使用断点)并检查客户和配偶的记忆。配偶为空,但客户不是。

client 不应该为空,因为它的内存是浅拷贝的结果?

干杯

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

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

现在你在另一张纸上写下:CLIENT:。然后你把第一张纸上 SPOUSE 后面的内容抄下来。

现在你有两张纸。一个说 "SPOUSE: 123 Sesame Street"。另一个说 "CLIENT: 123 Sesame Street".

现在你擦掉页面上写着 SPOUSE 的地址。

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


您在选择行话时很明显感到困惑。

不说"makes a shallow copy"。说 "copies a reference",因为这就是您正在做的。 "Shallow"是相对的,不用说相对于什么。说说真正发生的事情:正在复制值并且该值是一个引用

不说"this object is null"。这就像说 "the car in my driveway that is not there";这是荒谬的。 变量 可以包含[=36​​=] 空引用。 引用可以是空引用;它是指没有对象的引用。但它不是一个对象;就是没有对象。

当您使您的语言准确无误时,这些混淆就会开始迅速消失。

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

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

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# 中不是正确的方式。 C# 为我们提供了一个可以用来执行浅拷贝的函数。函数是 MemberwiseClone().

试试这个

Client = Spouse.MemberwiseClone();

如果它不适合你,请告诉我。 干杯