你不能这样做,每次你想添加到列表时都需要创建一个新对象,否则你将继续修改旧对象。
请记住,当您向列表添加引用类型时,您只是将其reference
放入列表中,而不是被引用的对象。这意味着如果你总是推送同一个实例,列表中的所有“项目”实际上都是同一个项目。考虑:
newSaveData 1000
+-----------+ +--------------------+
| 1000 |--------------------->| save_property1 |
+-----------+ | save_property2 |
+--------------------+
newSaveDataList ^
+-----------+ |
| 1000 |---------------------------------+
+-----------+ |
| 1000 |---------------------------------+
+-----------+ |
| 1000 |---------------------------------+
+-----------+ |
| 1000 |---------------------------------+
+-----------+
因此,您需要为每个添加到列表中的对象创建一个新的对象实例,以便它们都是可以变化的不同对象:
while (yourLoopCondition)
{
// each item you want to add, create a new instance.
newSaveData = new SaveData();
if (someCondition1)
{
newSaveData.save_property1 = x
}
if (someCondition2)
{
newSaveData.save_property2 = y
newSaveDataList.Add(newSaveData);
}
}
以上假设每个对象都是不同的,而不是循环的多次迭代中的“飞行中的对象”。
现在,如果您有一个主要对象并且您只是想将该对象的“快照”放入列表中,您可以使用某种克隆方法或“复制构造函数”来做到这一点:
public class SaveData
{
public double save_property1;
public double save_property2;
public SaveData(SaveData other)
{
save_property1 = other.save_proerty1;
save_property2 = other.save_property2;
}
}
然后,如果您想将 asnapshot
放在飞行中的对象列表中,您可以这样做:
newSaveDataList.Add(new SaveData(newSaveData));
或者,您可以使用 astruct
代替,它是一种值类型,因此会在列表中放置一个副本,但struct
有很多有趣的怪癖,在使用它们之前应该非常仔细地考虑这些怪癖。我在这里有一个关于这个主题的帖子