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

时间:2016-01-14 04:15:10

标签: c# shallow-copy

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

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

然后我暂停(在另一条线上使用断点)并检查客户端和配偶的内存。配偶是空的,但客户不是。

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

干杯

3 个答案:

答案 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

请告诉我它是否适合您。 欢呼声