带成员的C#静态成员类

时间:2017-05-11 23:36:32

标签: c# class static

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

class BuildingA{
   static BuildableComponent buildableA;
}

class BuildingB{
   static BuildableComponent buildableB;
}

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

class BuildableComponent{
    int cost;
}

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

2 个答案:

答案 0 :(得分:3)

默认情况下,字段在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; }
}

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

int cost = BuildingA.buildableA.cost;

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

答案 1 :(得分:2)

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

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

class BuildableComponent{
    public int cost;
}

OR

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