【发布时间】:2015-04-04 12:27:43
【问题描述】:
所以我有一个静态项目列表,其中存储了一些类,在这些类中是变量,例如“int ID”、“string name”、“string description”、“int currentAmount”等。
ItemDatabase.cs...
public static List<Item> Items
static void LoadItemData()
{
Items.Add(new item);
...
}
然后我有一个单独的项目列表,其中将添加项目供玩家使用。
Player.cs...
List<Item> playerItems;
然后在其他类中,我有AddItem(int ID) 方法:
void AddItem(int id)
{
foreach (Item i in ItemDatabase.Items)
if (i.ID == id)
playerItems.Add(i);
}
我目前正在添加将使用相同数据的实体。但是当我修改添加到 playerItems 的 Item 时,它会修改 ItemDatabase.Items (显然,由于引用)。
我不能将 Item 类变成一个结构,因为我还有其他派生自它的类。 我需要“currentAmount”整数按值计算。有什么办法可以做到吗?
P.S.,我已经尝试过深度克隆,但它与我的 Item 类不能很好地配合。
【问题讨论】:
-
为什么克隆不起作用?似乎这就是解决方案。如果您只是修改值类型(
string,int),您可以浅克隆吗? -
@DStanley,我尝试进行深度克隆,在每个类的顶部插入 [Serializable] 属性,但是我无法控制的其他类(如 Texture2D)给了我这个。我在 Item 类中还有其他类。如果我不进行深拷贝,它们不会被设置为 null 吗?
-
您不需要序列化来进行深度克隆 - 序列化和反序列化只是一种方式。如果您不更改引用类型,那么我只会做一个浅克隆(手动复制属性 vlaues 或使用
object.MemberwiseClone -
@DStanley,非常感谢。我尝试了 MemberwiseClone,效果很好。你介意把它作为答案吗?
标签: c# reference pass-by-reference