C# 向列表中添加新对象将替换列表中的所有其他对象

C# 向列表中添加新对象将替换列表中的所有其他对象,c#,winforms,C#,Winforms,我正在用C#处理Windows窗体,我有一个Character对象,它是从一个窗体的用户输入生成的,然后通过自定义事件处理程序传递回主窗体 然后将新对象添加到主窗体上的列表中。但是,当一个新项目添加到主窗体的列表中时,它也会替换列表中的所有其他项目,因此我最终得到一个包含所有相同对象的列表 下面是我试图将新对象添加到列表中的代码 private void HandleCharacterCreated(object sender, EventArgs e) { CharCreatorFor

我正在用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();
}
如果有帮助,下面是输入表单中的代码块,然后将其传递回要添加到列表中的主表单

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
}
public void CreateCharacter()
{

newCharacter=new Character();//newCharacter变量是全局变量吗?如果是,您正在覆盖引用变量,并且它不是错误,而是功能,请尝试创建新的“newCharacter”object就是这样!我简直不敢相信我错过了这么简单的东西。谢谢!@JohnMack:我怀疑与其按照这个答案添加构造函数调用,不如删除
newCharacter
字段,而只是在
CreateCharacter
方法中使用一个局部变量。