这个演示类解释问题
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,无论如何,我想要的是什么
任何人都有助于消除这种困惑。
答案 0 :(得分:1)
每次你做
someClassObj = new SomeClass();
在堆中创建了一个新的内存块,它的地址被分配给someClassObj
,这意味着在你的列表中实际上只有一个地址,你一次又一次地添加,但是一个新的地址,这就是为什么当你将比较它们不相同的对象,因为它们具有不同的地址
最初
SomeClass someClassObj = null;
你的对象没有任何指示。当您使用new ()
创建新实例时,您的对象开始指向新分配的内存地址。因此,在内部循环中,每个实例都分配了新地址,并且该地址存储在SomeClass
中,这是相同的指针/引用。当您在列表中添加项目时,它实际上会添加SomeClass
答案 1 :(得分:1)
您实际执行的操作是在每次迭代时为someClassObj
分配新引用,然后将此引用的副本添加到列表中。您没有在列表中添加对someClassObj
的引用。 Add
方法需要使用ref
参数才能使其成为someClassObj
的引用。