【问题标题】:C# static member class with members带有成员的 C# 静态成员类
【发布时间】:2017-05-11 23:36:31
【问题描述】:

我有一些带有静态成员的类:

class BuildingA{
   static BuildableComponent buildableA;
}

class BuildingB{
   static BuildableComponent buildableB;
}

这个静态成员有它自己的成员:

class BuildableComponent{
    int cost;
}

我希望能够通过 BuildingA 和 BuildingB 类来操作静态成员,例如 A.buildableA.cost 和 B.buildableB.cost - 我描述的方式不太有效,但是有没有办法做到这一点?

【问题讨论】:

  • 为成员添加非私有修饰符
  • “不太好用”是什么意思?
  • 这不应该被否决,是的,这是一个基本的问题尝试,并且提供了所有必要的代码。
  • @EamonnMcEvoy 为什么不编辑帖子而不是提供错误消息以及解释为什么在这种情况下通过搜索该错误消息找到的答案还不够?

标签: c# class static


【解决方案1】:

字段在 C# 中默认是私有的 - 您需要为其添加一个 public 访问修饰符:

class BuildableComponent
{
    public int cost;
}

但是,按照@EamonnMcEvoy 的建议,您可以将其设为属性:

class BuildableComponent
{
    public int Cost { get; private set; }
}

建议使用属性,因为您可以使其他类可以读取该字段,而不允许其他类修改该属性(正如我在上面通过将 setter 设为私有所做的那样)。它们还有其他优点,一个是如果需要,它们可以在派生类中被覆盖。

在 C# 6 中,您还可以完全省略 setter,强制仅从构造函数设置值并使属性不可变:

class BuildableComponent
{
    public BuildableComponent(int cost)
    {
        Cost = cost;
    }

    public int Cost { get; }
}

您还有一个问题是BuildingA 和BuildingB 中的BuildableComponent 字段是static。这意味着它们属于类,而不是类的实例(即类的每个实例共享相同的值)。这意味着您需要通过类名而不是类的实例来访问它:

int cost = BuildingA.buildableA.cost;

在这种特殊情况下,我会问自己是否希望这个组件是静态的。如果要创建多个BuildingA 实例,是否希望它们共享相同的组件?如果不是,请将它们设为非静态的。

【讨论】:

    【解决方案2】:

    在 c# 中,类中的成员默认为 private,因此 cost 只能从 BuildableComponent 的实例中访问。

    您需要将public 访问修饰符添加到您的cost 字段,或者更好的是,将其设置为具有get 和set 的属性:

    class BuildableComponent{
        public int cost;
    }
    

    或

    class BuildableComponent{
        public int Cost { get; set; };
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-02
      • 2018-10-05
      相关资源
      最近更新 更多