为什么这个对象在浅拷贝后不为空?
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();
如果它不适合你,请告诉我。
干杯
下面是我给客户的配偶副本(都是相同的对象类型)。 然后将 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();
如果它不适合你,请告诉我。 干杯