需要澄清引用类型的行为

时间:2018-12-09 08:54:24

标签: c# oop reference-type

我已经读过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值相同的堆位置,但是基于该文章,不应复制数据。另外我的问题不应该被标记为重复,因为我知道值和引用类型之间的区别,如果我们可以简单地使用赋值,我只需要澄清一下引用类型以及深度复制/克隆/浅层的用途是什么?

2 个答案:

答案 0 :(得分:2)

  

对于i2,我希望它指向与i1相同的堆位置   正确的值

正确,它们指向内存中的相同位置。

  

但根据文章,不应复制数据。

再次更正,数据不会被复制,让我们一起进行一些说明:

             _ _ _ _
            |       |
 i1  - - - -| addr  |
            |_ _ _ _|

现在,当您执行Class1 i2 = i1;时,实际上是在复制i1的引用并将其分配给i2,您可以将其可视化为:

             _ _ _ _
            |       |
 i1  - - - -| addr  |
            |_ _ _ _|
          /
         /               
        /     
   i2  /

因此i1.Namei2.Name具有相同的名称,因为i1i2都引用了内存中的同一对象。

答案 1 :(得分:0)

引用只是指向对象的指针。这样做只是复制参考。如果您这样做,i2.Name = "foobar"; i1.Name也将更改为foobar