c# - 将新对象添加到列表会替换列表中的所有其他对象
问题描述
我正在使用 C# 中的 Windows 窗体,并且我有一个 Character 对象,该对象是从一个窗体的用户输入生成的,然后通过自定义事件处理程序传递回主窗体。
然后将新对象添加到主窗体上的列表中。然而,当一个新项目被添加到主窗体的列表中时,它也会替换列表中的所有其他项目,所以我最终得到了一个包含所有相同对象的列表。
这是我尝试将新对象添加到列表的代码。
private void HandleCharacterCreated(object sender, EventArgs e)
{
CharCreatorForm extractForm = sender as CharCreatorForm;
characterList.Add(extractForm.NewCharacter);
Debug.WriteLine("NEW LINE");
foreach (Character character in characterList)
{
Debug.WriteLine(character);
}
SetCharacterCountValue();
if (CharacterAdded != null)
{
CharacterAdded(this, new EventArgs());
}
}
如果有帮助,这里是输入表单中的代码块,然后将其传递回主表单以添加到列表中。
public void CreateCharacter()
{
newCharacter.Name = nameTextBox.Text;
newCharacter.Level = levelPicker.Value;
newCharacter.Race = racePicker.Text;
newCharacter.Class = classPicker.Text;
if (goodRadioBtn.Checked == true && evilRadioBtn.Checked == false)
{
newCharacter.Alignment = 1;
}
else if(evilRadioBtn.Checked == true && goodRadioBtn.Checked == false)
{
newCharacter.Alignment = 2;
}
newCharacter.ImageIndex = classPicker.SelectedIndex;
if (CharacterCreated != null)
{
CharacterCreated(this, new EventArgs());
}
ClearFields();
}
解决方案
CreateCharacter()
不是更新一个新角色,而是只是在现有对象上设置新的属性值。
由于class
对象是引用对象,因此您将一遍又一遍地向列表中添加相同的“引用”,并且每次都会改变(更改属性)指针指向的内存中的单个对象。
简单的解决方法是在您的CreateCharacter()
方法中创建一个新角色:
public void CreateCharacter()
{
newCharacter = new Character(); // <-- here.
newCharacter.Name = nameTextBox.Text;
newCharacter.Level = levelPicker.Value;
newCharacter.Race = racePicker.Text;
newCharacter.Class = classPicker.Text;
// ... etc
}
推荐阅读
- javascript - 在 html 加载之前执行警报
- matrix - netlogo:创建一个随机数矩阵
- python - 用字符串连接变量给出 SyntaxError
- python - 有关获取 aerospike 集中记录总数的说明?需要 Lua 脚本吗?
- php - 通过 JSON 数字索引标准类对象创建 foreach 循环
- android - Android Studio:静态手机预览
- arrays - 汇编语言中的多维数组 (2x2) 初始化 - Y86
- python - 如何为 Google Cloud Function 提供适当的身份验证以在 Python 中访问日历 API
- unity3d - 将游戏对象从 Unity 中的生成器连接到窗格?
- javascript - 如何在不刷新页面的情况下自动更新角度购物车中的产品数量