【问题标题】:c#: passing struct object to struct objectc#:将结构对象传递给结构对象
【发布时间】:2013-11-17 10:25:43
【问题描述】:

我试图创建一个拥有一套技能和一套特色的“玩家”。每个技能都与某个特殊技能相关联。

然后玩家将获得 7 个特殊技能和 13 个技能。为了使其更具可读性(在我看来),我将结构用于特殊、技能和玩家。这也适用于使用 structs..

请看一下我的代码,很简单。

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;

为什么会这样?这是不好的做法吗?好吧,无论如何我都不会使用它,因为如果我更改特殊球员,它将不会在易货交易中更新,因为我了解到结构是按值而不是引用传递的。但是我关于为什么我不能用结构初始化结构的问题仍然存在。

【问题讨论】:

  • 你为什么在那里使用结构而不是类?
  • 我想练习使用结构。但是我实际上会将播放器更改为一个类。

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


【解决方案1】:

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

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

无论如何,您可能应该使用类。

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

【讨论】:

  • 是的,它们应该是公开的,因为我想在另一个课程中使用它们,我只是忘了更改它。除此之外,我将不得不阅读更多关于结构与类的信息。谢谢。
【解决方案2】:

Struct 是 VALUE TYPES,这意味着您不能使用 new 关键字来实例化它们。 直接用

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

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

【讨论】:

  • 您当然可以使用new 关键字创建结构,请参阅msdn.microsoft.com/en-us/library/0taef578.aspx
  • 坦率地说,我不明白为什么这个答案会得到两个赞成票。显示的代码在 C# 中不可编译,并且解释不正确。 @lauCosma,请您更正或删除答案,以免将来的访问者感到困惑?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 2021-03-10
  • 2010-09-22
  • 1970-01-01
相关资源
最近更新 更多