使用变量的副本而不是引用

时间:2017-10-22 05:08:41

标签: c#

我试图访问变量的副本,而不是变量本身。 例如,我希望敌人在被杀时丢掉一定数量的骨头。

Enemy1:掉落骨头1

Enemy2:掉落骨头2

而不是重新创建这个项目' Bones'对于每一种敌人,我希望有一个包含所有物品的类,敌人如Enemy1和Enemy2可以使用AllItems.Bones来获得Bones掉落。当我想在Enemy2.cs中更改drop对象的quantity变量时,会出现问题。当我执行'drop.quantity = 2'时,Enemy1的掉落量也会变为2。以下是我使用的代码:

//AllItems.cs
public class AllItems{
    public static Item Bones = new Item();
}

//Item.cs
public class Item{
    public int quantity = 1;
}

//Enemy1.cs
public class Enemy1{
    Item drop;
    public Enemy1(){
        drop = AllItems.bones;
    }
}

//Enemy2.cs
public class Enemy2{
    Item drop;
    public Enemy2(){
        drop = AllItems.bones;
        drop.quantity = 2;
    }
}

有没有办法将Enemy1和Enemy2的Drop设置为AllItems.Bones并修改掉落而不影响其他人?

如果有一个简单的解决方案,我很抱歉。我已经找了很久但现在没有成功。我可以提供任何有关我为什么以某种方式做某事或根据要求设置某些事情的其他信息。

谢谢。

2 个答案:

答案 0 :(得分:2)

首先,您只需将属性中的=更改为=>

public static Item Bones => new Item();

每次访问时都会创建新的Item

但我宁愿创建一个用于创建一组新骨骼的功能 - IMO会更加直观和清晰:

public class AllItems{
    public static Item CreateNewSetOfBones()
    { 
        return new Item();
    }
}

或简短的语法:

public class AllItems{
    public static Item CreateNewSetOfBones() => new Item();
}

答案 1 :(得分:1)

实际上,当您使用static字段或属性时,它在任何地方只共享一个实例。 相反,我建议你把它变成非静态的。以下应该做的伎俩。

//AllItems.cs
public class AllItems
{
    public static Item GetBones()
    {
        return new Item();
    }
}

如果有任何混淆,请告诉我。