我已经读过Difference between a Value Type and a Reference Type,在本文中,作者说:
因为引用类型表示变量的地址,而不是数据本身,所以将引用变量分配给另一个不会复制数据。相反,它创建了引用的第二个副本,该副本指向堆中与原始值相同的位置
基于上面的引用,我期望以下代码会将引用变量分配给另一个变量,它不会复制数据,但实际上也正在复制数据。您能帮我理解吗?
Class1 i1 = new Class1();
i1.Name = "Name1";
Class1 i2 = i1;
//i2.Name is "Name1"
对于i2
,我希望它指向与正确的i1
值相同的堆位置,但是基于该文章,不应复制数据。另外我的问题不应该被标记为重复,因为我知道值和引用类型之间的区别,如果我们可以简单地使用赋值,我只需要澄清一下引用类型以及深度复制/克隆/浅层的用途是什么?
答案 0 :(得分:2)
对于i2,我希望它指向与i1相同的堆位置 正确的值
正确,它们指向内存中的相同位置。
但根据文章,不应复制数据。
再次更正,数据不会被复制,让我们一起进行一些说明:
_ _ _ _
| |
i1 - - - -| addr |
|_ _ _ _|
现在,当您执行Class1 i2 = i1;
时,实际上是在复制i1
的引用并将其分配给i2
,您可以将其可视化为:
_ _ _ _
| |
i1 - - - -| addr |
|_ _ _ _|
/
/
/
i2 /
因此i1.Name
和i2.Name
具有相同的名称,因为i1
和i2
都引用了内存中的同一对象。
答案 1 :(得分:0)
引用只是指向对象的指针。这样做只是复制参考。如果您这样做,i2.Name = "foobar";
i1.Name
也将更改为foobar
。