如何查找对象是否共享公共内存或不同内存分配

时间:2016-06-23 17:48:55

标签: c#

我想了解下面代码在内存分配方面的行为。

我有两个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。为什么呢?

2 个答案:

答案 0 :(得分:3)

让我们假装每个List<String>都是一所房子,每个变量list1list2都是一纸空文。让我通过对正在发生的事情的类比来引导你。

第一行代码实际上是做了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)

list1list2对一个对象有两个相同的引用。将“C”添加到list1时,您将更改一个对象。将null设置为list1时,只删除对一个对象的引用,但此对象仍保留在内存中。

相关问题