首页 文章

需要对引用类型的行为进行一些澄清

提问于
浏览
0

我读过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 回答

  • 2

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

    正确,它们指的是内存中的相同位置 .

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

    再次纠正,数据没有复制,让我们一起说明:

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

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

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

    因此 i1.Namei2.Name 具有相同的名称,因为 i1i2 都指向内存中的同一对象 .

  • 0

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

相关问题