我有一些带有静态成员的类:
class BuildingA{
static BuildableComponent buildableA;
}
class BuildingB{
static BuildableComponent buildableB;
}
这个静态成员拥有自己的成员:
class BuildableComponent{
int cost;
}
我希望能够通过BuildingA和BuildingB类来操纵静态成员,例如A.buildableA.cost和B.buildableB.cost - 我所描述的方式并不是很有效,但是有没有办法做到这一点?
答案 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; }
}
您还有一个问题,即BuildableComponent
和BuildingA
内的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; };
}