【问题标题】:After assignment referance object is not null, how is possible?赋值后引用对象不为空,怎么可能?
【发布时间】:2019-12-25 07:49:22
【问题描述】:

对象 a 为空,但我看到对象 b 在运行时不为空。为什么对象 b 不为空?

List<int> a = new List<int>();
List<int> b = a;
a = null;

【问题讨论】:

    标签: c# .net null pass-by-reference assignment-operator


    【解决方案1】:

    通过这样做List&lt;int&gt; a = new List&lt;int&gt;();,您创建了一个位于堆中的对象和一个对该对象的引用(变量a)。

    通过这样做List&lt;int&gt; b = a;,您可以为堆中的同一个对象再创建一个引用(变量b)。

    所以你有两个引用和一个对象。

    通过这样做a = null;,您正在杀死一个参考。

    那么还剩下什么?引用b,它指的是堆中的对象。

    如果你要杀死b,垃圾收集器将从堆中收集对象,因为它没有留下任何引用。

    【讨论】:

    • a.add(5);在调试中变量 b 的计数为 1 之后。如果这里有两个 ref 为什么列表 b 的计数为 1?
    • @slmksy 因为您已将 one 元素添加到数组中。该元素的类型为整数且等于 5。
    【解决方案2】:

    想象一下new 关键字,当您租用公寓一段时间时。每当您使用new 关键字时,都会保留一个新公寓供您随意使用。

    在您的代码中,ab 只是我们的公寓所在位置的引用

    List&lt;int&gt; a = new List&lt;int&gt;(); 行中,您正在租用一间公寓并创建一个变量a,其中将包含该公寓的地址。把这个参考想象成你在纸上写的一张便条,上面写着公寓的地址。

    List&lt;int&gt; b = a; 行你只是在创建另一个笔记,与第一篇论文中的公寓地址相同。

    您实际上是在创建 2 个包含公寓地址的不同注释。

    当您运行a = null; 时,它不会更改b 的值,因为ab 彼此不相关。使用我们的类比,您只是在更改第一个注释中写的内容;只要您的第二条笔记b,您租用的公寓仍然存在。

    在类比中,单元是进程内存的一个特殊区域中的一个数据块,为动态分配保留,称为heap。两个变量ab 将是分配在另一个称为stack 的特殊内存区域中的小数据,其中包含为List&lt;int&gt; 分配的数据块的地址。

    【讨论】:

    • @slmksy 抱歉,我误读了这个问题,但刚刚更新了我的答案。请再读一遍。
    【解决方案3】:

    使用此语句 ab '指向'同一个对象:

    List<int> b = a;
    

    当你这样做时

    a = null;
    

    a“指向”不同的东西,而b 没有被触及(仍然指向列表)。

    a 和 b 都不是列表,它们只是指向或引用创建的对象

    【讨论】:

      【解决方案4】:

      这样,b 有 new List&lt;int&gt;(); 地址,所以你设置 a = null ,没关系。

      【讨论】:

        猜你喜欢
        • 2020-02-11
        • 2015-01-21
        • 1970-01-01
        • 2015-10-04
        • 2018-11-12
        • 1970-01-01
        • 2019-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多