【发布时间】:2016-06-23 17:48:55
【问题描述】:
我想从内存分配的角度了解以下代码的行为。
我有两个 List 对象,如下所示。
var list1 = new List< string > (){ "A","B" };
var list2 = new List<string>();
list2 = list1;
list1 = null;
当我将 list1 设置为 null 时,list2 对象保持原样。
但我再次尝试在分配给 list2 后修改 list1 对象,然后 list2 的值更改为最新的 list1。我对这种行为有点困惑。
更改代码 sn-p:
var list1 = new List< string > (){ "A","B" };
var list2 = new List<string>();
list2 = list1;
list1.Add("C");
list1 = null;
在上面的代码中,当我将 list1 分配给 list2 时,list 有 2 个字符串,但后来我向 list1 添加了一个字符串,甚至将相同的字符串添加到了 list2。为什么?
【问题讨论】:
-
您可以将list2 = list 1读作“使list2引用指向与list1在内存中相同的位置”,并且list2指向的对象被标记为垃圾回收,因为没有任何东西指向它。然后,当您设置 list1 = null 时,这意味着“使 list1 引用指向未分配的对象”
-
在第二个示例中,两个变量都指向内存中完全相同的位置,因此添加到 list1 与添加到 list2 相同。
标签: c#