记录清单

时间:2015-10-07 14:38:07

标签: c# list

以下代码似乎在列表中添加了一条新记录,但用最后创建的记录覆盖了所有记录。 我可以用它来正常工作......

lpr.Add(new personRecord(){Age = pr.Age,Name = pr.Name});

但这看起来更长,在真实的应用程序中,记录要大得多。

private void button1_Click(object sender, EventArgs e)
{
    personRecord pr = new personRecord();

    List<personRecord> lpr = new List<personRecord>();

    pr.Age = 40;
    pr.Name = "Bob";
    lpr.Add(pr);

    pr.Age = 30;
    pr.Name = "Steve";
    lpr.Add(pr);

    pr.Age = 44;
    pr.Name = "Phil";
    lpr.Add(pr);

    pr.Age = 33;
    pr.Name = "Sue";
    lpr.Add(pr);
}

public class personRecord
{
    private int age;
    private string name;

    public int Age
    {
        get { return age; }
        set { age = value; }
    }

    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}

3 个答案:

答案 0 :(得分:3)

pr是对象的引用。当您更改pr的值时,您正在更改同一对象的值并将该引用添加到列表中。因此,您的列表包含对同一对象的多个引用,您设置的最后一个值将由每个引用反映。

您可以通过添加

来解决它
pr = new personRecord();

在每个块之前确保pr每次都引用 new 对象。

当你这样做时

lpr.Add(new personRecord(){Age = pr.Age,Name = pr.Name});

您正在添加对对象的引用,只是复制单个pr引用中的值。

答案 1 :(得分:2)

这是你想要实现的目标吗?

private void button1_Click(object sender, EventArgs e)
{
  List<personRecord> lpr = new List<personRecord>
  {
    new personRecord { Age = 40, Name = "Bob" },
    new personRecord { Age = 30, Name = "Steve"},
    new personRecord { Age = 44, Name = "Phil"},
    new personRecord { Age = 33, Name = "Sue"},
 };
}

答案 2 :(得分:0)

what is different between Passing by value and Passing by reference using C#可能重复。

但由于pr是一个类,这意味着当您将其添加到列表中时,实际上只将引用存储到该变量中。当您更改该变量时,接下来3次实际更改的是位于原始参考的内存中的值。因此,您的列表实际上包含对具有相同值的同一对象的4个引用。

如果您尝试重复使用同一个对象(因为这可能是您视图的模型),您应该使用它的值创建一个新对象,并将此新对象添加到列表中。

相关问题