赋值后引用对象不为空,怎么可能?
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
关键字时,都会为您保留一个新公寓供您使用。
在您的代码中,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>
.[=27 分配的数据块的地址=]
用这条语句 a
和 b
'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没关系。
对象a是null,但是我看到对象b在运行时不是null。为什么对象 b 在这种情况下不为空?
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 个包含公寓地址的不同笔记。
当你 运行 a = null;
它不会改变 b
的值,因为 a
和 b
彼此不相关。使用我们的类比,您只是在更改第一个音符中所写的内容;只要你写第二条笔记 b
.
在类比中,公寓将是进程内存的一个特殊区域中的数据块,该区域保留给称为 heap
的动态分配。 a
和 b
这两个变量将是分配在另一个称为 stack
的特殊内存区域中的小数据,其中包含为 List<int>
.[=27 分配的数据块的地址=]
用这条语句 a
和 b
'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没关系。