以下代码似乎在列表中添加了一条新记录,但用最后创建的记录覆盖了所有记录。 我可以用它来正常工作......
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; }
}
}
答案 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个引用。
如果您尝试重复使用同一个对象(因为这可能是您视图的模型),您应该使用它的值创建一个新对象,并将此新对象添加到列表中。