猿问

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

我基于结构创建了一个列表,但无法更改项目值。所以我使用了一个类而不是结构体,但是当我打印列表时出现问题,它给了我根据项目数量插入的最新项目。


例如。如果我插入 "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);

// and

item.Add(xItem);

在btnSave_Click我添加这个


foreach (var s in item)

{

  System.Diagnostics.Debug.WriteLine(s.Code +" \t " + s.Qty);

}


呼如林
浏览 461回答 3
3回答

慕姐8265434

听起来您正在重复使用该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&nbsp;//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);

九州编程

这是由于引用和值类型语义。甲参考型(=类)仅仅是一个指针,指向一个实例。因此,当您将一个对象传递给方法时,您实际上提供了一个指向该对象的指针,而不是实际的对象。您通过该引用更改的所有内容都会反映在对该实例的所有引用上。在您的情况下,您只有一个用于不同实例语义的引用。因此创建一个新实例而不是重新使用现有实例: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?
随时随地看视频慕课网APP
我要回答