以下是我的配偶副本到客户端(两者都是相同的对象类型)。 然后将配偶设为空。
client = spouse; // Copying data
spouse = null;
然后我暂停(在另一条线上使用断点)并检查客户端和配偶的内存。配偶是空的,但客户不是。
不应该客户端为空,因为它的内存是浅拷贝的结果?
干杯
答案 0 :(得分:13)
你的配偶住在芝麻街123号。
你在一张纸上写下:SPOUSE:123芝麻街。
现在你写下另一张纸:客户:然后你在第一张纸上复制SPOUSE之后所说的内容。
现在你有两张纸。一个人说" SPOUSE:123芝麻街"。另一个说"客户:123 Sesame Street"。
现在您删除显示SPOUSE的页面上的地址。
客户现在说的页面是什么?
你选择的行话表明你的困惑很明显。
不要说"制作浅色副本"。说"复制参考",因为那是你正在做的事情。 "浅"相对于什么是相对的,没有说。说出真正发生的事情:正在复制值,值是参考。
不要说"此对象为空"。这就像是说我车道上的车不在那里&#34 ;;这是荒谬的。 变量可以包含空引用。 引用可以是 null引用;它是指没有对象的引用。但它不是一个对象;没有物体。
当你的语言准确无误时,这些混乱就会迅速消失。
答案 1 :(得分:3)
这不会发生,因为您正在更改指针的值,而不是对象本身。
让我们想象一下这种情况:
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.
答案 2 :(得分:-3)
您使用浅拷贝的方式不适合C#。 C#为我们提供了一个可以用来执行浅拷贝的函数。函数是Client = Spouse.MemberwiseClone();
。
试试这个
before_insert
请告诉我它是否适合您。 欢呼声