c#:将struct对象传递给struct对象

时间:2013-11-06 09:03:25

标签: c# struct static pass-by-reference

我试图创造一个拥有一系列技能和一系列特色的“玩家”。每项技能都与某种特殊关联。

然后玩家获得7个特殊技能和13个技能。为了使它更具可读性(在我的意见中),我使用结构特殊,技能和玩家。这也适用于使用结构的prectice ..

请查看我的代码,这很简单。

private struct specials
{
   public string name;
   public int value;

   public specials(string n, int v)
   {
       this.name = n;
       this.value = v;
   }
}

private struct skills
{
    public string name;
    public specials spec;
    public int value;

    public skills(string n, specials s, int v)
    {
        this.name = n;
        this.spec = s;
        this.value = v;
    }
}

public struct player
{
    public specials strength = new specials("STRENGTH", 0);
    public specials perception = new specials("PERCEPTION", 0);
    public specials endurance = new specials("ENDURANCE", 0);
    public specials charisma = new specials("CHARISMA", 0);
    public specials intelligence = new specials("INTELLIGENCE", 0);
    public specials agility = new specials("AGILITIY", 0);
    public specials luck = new specials("LUCK", 0);

    //Complains about charisma, saying an object reference is required for 
    // the nonstatic field method or property
    public skills barter = new skills("Barter", charisma, 0); 
}

我可以在代码中的注释中看到我的问题。现在,我不明白为什么这应该是一个问题。

玩家有自己的特殊性和自己的技能,而且技能又与特殊相关联(我希望通过参考)。

public specials charisma = new specials("CHARISMA", 0);

这会创建一个名为charisma的新特殊对象,对吧?那么为什么不能将它传递给新的技能对象。

最后一件事。出于某种原因,我仍然不明白,但真的想知道,这是通过在声明魅力时使用静态来解决的,但我无法通过输入

来改变它在我的表单类中
player.charisma.value = 123;

问候!


编辑:

我刚刚发现了一些我无法解释的东西。而不是写(产生错误)

public skills barter = new skills("Barter", charisma, 0);

我写道:(玩家现在是一个班级)

public skills barter = new skills();

然后在玩家构造函数中,我可以像这样设置易货交易:

barter.spec = strength;

为什么会出现这种情况?这是不好的做法吗?好吧,我还是不会使用它,因为如果我改变玩家的特殊性,它不会在易货中更新,因为我知道结构是通过值传递而不是参考。但是我的问题为什么我不能用结构初始化结构仍然存在。

2 个答案:

答案 0 :(得分:2)

首先,你定义的第一个结构是私有的,这很奇怪(除非它们嵌套在其他类型中)。

其次,你不能在结构中使用实例字段初始值设定项,所以基本上你的整个player结构都是无效的,所以我不知道你是如何得到你描述的错误而没有遇到这个错误。

无论如何,你应该使用课程。

至于你的最后一个问题,静态成员与类型相关联,而不是 所述类型的实例,这就是为什么你不能为个别实例更改它们的原因。

答案 1 :(得分:0)

Struct VALUE TYPES ,这意味着您无法使用new关键字对其进行实例化。 直接尝试

public specials charisma = specials("CHARISMA", 0)

同时结帐:http://msdn.microsoft.com/en-us/library/s1ax56ch.aspx 希望这有帮助!