提问人:slmksy 提问时间:8/20/2019 更新时间:8/20/2019 访问量:98
赋值后引用对象不为空,怎么可能?
After assignment referance object is not null, how is possible?
问:
对象 a 为 null,但我看到对象 b 在运行时不为 null。为什么在这种情况下对象 b 不为 null?
List<int> a = new List<int>();
List<int> b = a;
a = null;
答:
想象一下,当您租用公寓一段时间时,关键字。每当您使用该关键字时,都会保留一个新公寓供您随意使用。new
new
在您的代码中,并且只是在我们的类比中引用我们的公寓的位置。a
b
在该行中,您正在租用公寓并创建一个包含该公寓地址的变量。想象一下,这个参考是你在一张纸上写的一张纸条,上面写着公寓的地址。List<int> a = new List<int>();
a
您刚刚创建另一张纸条,其中包含与第一张纸中相同的公寓地址。List<int> b = a;
您实际上是在创建 2 个不同的注释,其中包含公寓的地址。
当您运行时,它不会更改 because 和 are 的值,并且彼此不相关。使用我们的类比,您只是在更改第一个音符中所写的内容;只要你的第二张纸条,你租的公寓仍然在那里。a = null;
b
a
b
b
在类比中,单元将是进程内存中保留给动态分配的特殊区域中的数据块,称为 。这两个变量和将小数据分配到另一个称为包含数据块地址的内存的特殊区域中。heap
a
b
stack
List<int>
评论
使用此语句和“指向”同一对象:a
b
List<int> b = a;
当你这样做时
a = null;
a
“指向”不同的东西,而未触及(并且仍然指向列表)。b
a 和 b 都不是列表,它们只是指向或引用创建的对象
通过这样做,您可以创建一个位于堆中的对象和一个对该对象(变量)的引用。List<int> a = new List<int>();
a
通过这样做,您可以创建对堆中同一对象的再一个引用(变量)。List<int> b = a;
b
所以你有两个引用和一个对象。
通过这样做,你正在扼杀一个引用。a = null;
那么还剩下什么呢?引用堆中的对象。b
如果你要杀,垃圾收集器将从堆中收集对象,因为它没有留下任何引用。b
评论
one
像这样,b 有地址,所以你设置 a = null ,它很重要。new List<int>();
评论