3 回答
TA贡献1813条经验 获得超2个赞
听起来您正在重复使用该xItem对象。您需要为列表中的每个项目创建一个新项目。该列表只是一个对象引用列表,目前它们都指向同一个实际对象。例如这个代码:
public static Item xItem = new Item();
public static List<Item> list = new List<Item>();
xItem.Code = "A";
xItem.Description = "A";
xItem.Price= "1";
xItem.Qty = "1";
list.Add(xItem);
//list now has 'A' with value of 1 in it..
xItem.Code = "B"
//without any further change, list will now have the same
//item, so its Code will now be "B":
//this will be TRUE:
var listIsNowB = (list[0].Code == "B");
相反,您需要这样做:
xItem.Code = "A";
xItem.Description = "A";
xItem.Price= "1";
xItem.Qty = "1";
list.Add(xItem);
//we're now done with that *instance* of Item, so we now create a *new* one.
//we can re-use our variable without problem though.
xItem = new Item();
xItem.Code = "B";
xItem.Description = "B";
xItem.Price= "2";
xItem.Qty = "2";
//xItem is a new object, so this will work as you expect now.
list.Add(xItem);
TA贡献1785条经验 获得超4个赞
这是由于引用和值类型语义。甲参考型(=类)仅仅是一个指针,指向一个实例。因此,当您将一个对象传递给方法时,您实际上提供了一个指向该对象的指针,而不是实际的对象。您通过该引用更改的所有内容都会反映在对该实例的所有引用上。
在您的情况下,您只有一个用于不同实例语义的引用。因此创建一个新实例而不是重新使用现有实例:
public static Item xItem = new Item();
public static List<Item> item = new List<Item>();
...
xItem = new Item();
xItem.Code = txtCode.Text;
xItem.Description = txtDescription.text;
xItem.Price= txtPrice.text;
xItem.Qty = txtQty.text;
顺便说一句,结构通常应该是不可变的。因此,无论何时您打算修改实例状态,您都应该考虑使用类而不是结构。要进一步了解 immutablilty,您还可以阅读这篇文章:Why are C# structs immutable?
- 3 回答
- 0 关注
- 436 浏览
添加回答
举报