我想了解下面代码在内存分配方面的行为。
我有两个List对象,如下所示。
var list1 = new List< string > (){ "A","B" };
var list2 = new List<string>();
list2 = list1;
list1 = null;
当我将list1设置为null时,list2对象保持原样。
但是我再次尝试在分配给list2后修改list1对象,然后将list2的值更改为最新的list1。我对这种行为感到有点困惑。
更改了代码段:
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。为什么呢?
答案 0 :(得分:3)
让我们假装每个List<String>
都是一所房子,每个变量list1
和list2
都是一纸空文。让我通过对正在发生的事情的类比来引导你。
第一行代码实际上是做了3个步骤:
在这一步中,您正在建造一个有两个房间A和B的房子
new List<string> (){ "A","B" };
在这一步中,您正在制作一张名为“list1”的新纸
var list1
在此步骤中,您将在名为“list1”的纸张上写下房子的地址
list1 = ...
下一行代码再次执行相同的3个步骤
在此步骤中,您将构建一个没有房间的房子
new List<string> ();
在这一步中,您正在制作一张名为“list2”的新纸
var list2
在这一步中,您正在写一张名为“list2”的纸上建造的第二宫的地址
list2 = ...
现在进行其余步骤
在此步骤中,您将获取写在名为“list1”的纸张上的地址,并删除写在名为“list2”的纸张上的地址,并将其替换为“list1”中的地址
list2 = list1;
你开车到写在名为“list1”的纸上的地址(这是写在名为“list2”的纸上的相同地址)并建立一个名为“C”的新房间
list1.Add("C");
在此步骤中,您将删除写在名为“list1”
的纸张上的地址list1 = null;
希望通过这个比喻为什么当你修改房子(一个物体)的地址被写在一张纸(一个变量)上时,另一张纸(另一个变量)上写有相同的地址也看到了变化。
答案 1 :(得分:0)
list1
和list2
对一个对象有两个相同的引用。将“C”添加到list1
时,您将更改一个对象。将null
设置为list1
时,只删除对一个对象的引用,但此对象仍保留在内存中。