为什么这个对象在浅层复制后不是null
本文关键字:复制 null 对象 为什么 | 更新日期: 2023-09-27 18:30:11
下面是我的配偶到客户端的副本(两者都是相同的对象类型)。然后将"配偶"设置为null。
client = spouse; // Copying data
spouse = 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();
如果它对你不起作用,请告诉我。欢呼