为了账号安全,请及时绑定邮箱和手机立即绑定

C# 中的 List<struct> VS List<class>

C# 中的 List<struct> VS List<class>

C#
呼如林 2021-10-24 19:43:38
我基于结构创建了一个列表,但无法更改项目值。所以我使用了一个类而不是结构体,但是当我打印列表时出现问题,它给了我根据项目数量插入的最新项目。例如。如果我插入 "A" , "B" , "C" 那么输出将是 CCC 而不是 ABC这是代码:public struct Item     //this is working fine but can't change item price{    public string Code { get; set; }    public string Description{ get; set; }    public string Price{ get; set; }    public string Qty { get; set; }}public static Class Item   //this is not working it's overwrite the last value{    public string Code { get; set; }    public string Description{ get; set; }    public string Price{ get; set; }    public string Qty { get; set; }}其余代码public static Item xItem = new Item();public static List<Item> item = new List<Item>();xItem.Code = txtCode.Text;xItem.Description = txtDescription.text;xItem.Price= txtPrice.text;xItem.Qty = txtQty.text;我尝试了这两个(给出相同的结果)item.Insert(i,xItem);// anditem.Add(xItem);在btnSave_Click我添加这个foreach (var s in item){  System.Diagnostics.Debug.WriteLine(s.Code +" \t " + s.Qty);}
查看完整描述

3 回答

?
慕姐8265434

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);


查看完整回答
反对 回复 2021-10-24
?
九州编程

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?


查看完整回答
反对 回复 2021-10-24
  • 3 回答
  • 0 关注
  • 436 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信