【发布时间】: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
对象 a 为空,但我看到对象 b 在运行时不为空。为什么对象 b 不为空?
List<int> a = new List<int>();
List<int> b = a;
a = null;
【问题讨论】:
标签: c# .net null pass-by-reference assignment-operator
通过这样做List<int> a = new List<int>();,您创建了一个位于堆中的对象和一个对该对象的引用(变量a)。
通过这样做List<int> b = a;,您可以为堆中的同一个对象再创建一个引用(变量b)。
所以你有两个引用和一个对象。
通过这样做a = null;,您正在杀死一个参考。
那么还剩下什么?引用b,它指的是堆中的对象。
如果你要杀死b,垃圾收集器将从堆中收集对象,因为它没有留下任何引用。
【讨论】:
one 元素添加到数组中。该元素的类型为整数且等于 5。
想象一下new 关键字,当您租用公寓一段时间时。每当您使用new 关键字时,都会保留一个新公寓供您随意使用。
在您的代码中,a 和 b 只是我们的公寓所在位置的引用。
在List<int> a = new List<int>(); 行中,您正在租用一间公寓并创建一个变量a,其中将包含该公寓的地址。把这个参考想象成你在纸上写的一张便条,上面写着公寓的地址。
List<int> b = a; 行你只是在创建另一个笔记,与第一篇论文中的公寓地址相同。
您实际上是在创建 2 个包含公寓地址的不同注释。
当您运行a = null; 时,它不会更改b 的值,因为a 和b 彼此不相关。使用我们的类比,您只是在更改第一个注释中写的内容;只要您的第二条笔记b,您租用的公寓仍然存在。
在类比中,单元是进程内存的一个特殊区域中的一个数据块,为动态分配保留,称为heap。两个变量a 和b 将是分配在另一个称为stack 的特殊内存区域中的小数据,其中包含为List<int> 分配的数据块的地址。
【讨论】:
使用此语句 a 和 b '指向'同一个对象:
List<int> b = a;
当你这样做时
a = null;
a“指向”不同的东西,而b 没有被触及(仍然指向列表)。
a 和 b 都不是列表,它们只是指向或引用创建的对象
【讨论】: