同一个类对象的多个引用赋值 - 引用问题

时间:2011-08-14 09:19:17

标签: c# reference

这个演示类解释问题

 public class SomeClass
    {
        public string Name { get; set; }
        public int Age { get; set; }

    }

在开发与此问题中包含的sample code相等的内容时,我得到了以下想法:

由于类是引用类型,并且如果我使用class object将多个实例分配给同一个loop并将这些对象存储在列表中,则不足以破坏每个对象并使其等于分配给它的最后一个实例?

以下是混淆的一些示例实现

List<SomeClass> lst = new List<SomeClass>();
SomeClass someClassObj = null;

for (int i = 0; i < 3; i++)
{
     someClassObj = new SomeClass();
     someClassObj.Name = "Name " + i.ToString();
     someClassObj.Age = i;
     lst.Add(someClassObj);
}
经过测试,它并没有像我想的那样w,无论如何,我想要的是什么 任何人都有助于消除这种困惑。

2 个答案:

答案 0 :(得分:1)

每次你做

someClassObj = new SomeClass();

在堆中创建了一个新的内存块,它的地址被分配给someClassObj,这意味着在你的列表中实际上只有一个地址,你一次又一次地添加,但是一个新的地址,这就是为什么当你将比较它们不相同的对象,因为它们具有不同的地址

最初

SomeClass someClassObj = null;你的对象没有任何指示。当您使用new ()创建新实例时,您的对象开始指向新分配的内存地址。因此,在内部循环中,每个实例都分配了新地址,并且该地址存储在SomeClass中,这是相同的指针/引用。当您在列表中添加项目时,它实际上会添加SomeClass

当前指向的项目的地址/引用

答案 1 :(得分:1)

您实际执行的操作是在每次迭代时为someClassObj分配新引用,然后将此引用的副本添加到列表中。您没有在列表中添加对someClassObj的引用。 Add方法需要使用ref参数才能使其成为someClassObj的引用。