赋值后引用对象不为空,怎么可能?

After assignment referance object is not null, how is possible?

对象a是null,但是我看到对象b在运行时不是null。为什么对象 b 在这种情况下不为空?

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

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

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

在行 List<int> a = new List<int>(); 中,您正在租用公寓并创建一个变量 a 来包含该公寓的地址。将此引用想象成您在纸上写下公寓地址的便条。

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

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

当你 运行 a = null; 它不会改变 b 的值,因为 ab 彼此不相关。使用我们的类比,您只是在更改第一个音符中所写的内容;只要你写第二条笔记 b.

,你租用的公寓就会一直存在

在类比中,公寓将是进程内存的一个特殊区域中的数据块,该区域保留给称为 heap 的动态分配。 ab 这两个变量将是分配在另一个称为 stack 的特殊内存区域中的小数据,其中包含为 List<int>.[=27 分配的数据块的地址=]

用这条语句 ab 'point' 到同一个对象:

List<int> b = a;

当你这样做时

a = null;

a 'points' 指向不同的东西,而 b 未被触及(仍然指向列表)。

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

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

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

所以你得到了两个引用和一个对象。

通过这样做 a = null; 你正在杀死一个引用。

那还剩下什么? Reference b 引用堆中的对象。

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

那样,b有new List<int>();地址,你设a=null没关系。