Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#具有成员的静态成员类_C#_Class_Static - Fatal编程技术网

C#具有成员的静态成员类

C#具有成员的静态成员类,c#,class,static,C#,Class,Static,我有一些带有静态成员的类: class BuildingA{ static BuildableComponent buildableA; } class BuildingB{ static BuildableComponent buildableB; } 此静态成员有自己的成员: class BuildableComponent{ int cost; } 我希望能够通过BuildingA和BuildingB类操纵静态对象的成员,例如A.BuildingA.cost和B.

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

class BuildingA{
   static BuildableComponent buildableA;
}

class BuildingB{
   static BuildableComponent buildableB;
}
此静态成员有自己的成员:

class BuildableComponent{
    int cost;
}

我希望能够通过BuildingA和BuildingB类操纵静态对象的成员,例如A.BuildingA.cost和B.BuildingB.cost——我所描述的方式不太管用,但有办法做到这一点吗

字段在C#中默认为私有-您需要向其添加
public
access修饰符:

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
字段是
静态的。这意味着它们属于该类,而不是该类的实例(即,该类的每个实例共享相同的值)。这意味着您需要通过类名而不是类的实例来访问它:

int cost = BuildingA.buildableA.cost;
在这种特殊情况下,我会问你自己是否希望这个组件是静态的。如果要创建多个
BuildingA
实例,是否希望它们共享相同的组件?如果不是,则使其非静态。

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

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

class BuildableComponent{
    public int cost;
}


向成员添加非私有修饰符“不太管用”这意味着什么?这不应该被否决,是的,这是一个基本问题,显然已经做出了尝试,并提供了所有必要的代码。@EamonnMcEvoy为什么不编辑帖子,而不是提供错误消息,并解释为什么在这种情况下,通过搜索错误消息找到的答案是不够的?
class BuildableComponent{
    public int Cost { get; set; };
}