C# 一个类如何可以被一种表单访问,而不能被另一种表单访问?

C# 一个类如何可以被一种表单访问,而不能被另一种表单访问?,c#,winforms,class,C#,Winforms,Class,我正在制作一个非常基本的2d(自上而下)“游戏”。因此,我使用两种形式。一个用于UI(UIForm),另一个用于游戏的视觉部分(Form1,也是要加载的第一个表单)。我还有一个类,它定义了不同的动物种类,并提供了大小等属性 然而,似乎我无法从我的Form1访问物种类,因为我已经创建了UIForm(它可以访问物种类) 这将导致IndexOutfrange异常: private Species species = new Species(); int i = this.species.size[1]

我正在制作一个非常基本的2d(自上而下)“游戏”。因此,我使用两种形式。一个用于UI(UIForm),另一个用于游戏的视觉部分(Form1,也是要加载的第一个表单)。我还有一个类,它定义了不同的动物种类,并提供了大小等属性

然而,似乎我无法从我的Form1访问物种类,因为我已经创建了UIForm(它可以访问物种类)

这将导致IndexOutfrange异常:

private Species species = new Species();
int i = this.species.size[1];
但这是可行的:

int i = UIForm.species.size[1];
在这里,为了测试,我以UIForm的形式公开了物种,并使用它访问类物种。这是可行的,所以我可以解决它,但我如何修复它?为什么会发生这种情况

在我制作UIForm之前,我习惯于从form1访问物种类

如果我说得太含糊或者很明显,我很抱歉,但我在这方面仍然是个傻瓜


(B.T.W.没有线程处理)

您在表单中将
物种
声明为
私有
,因此无法从表单外部访问它。您需要将其声明为
public
,同时在
Species
类中将
size
声明为
public
,这看起来好像Species是
UIForm
上的一个属性/字段,当您在下一个表单中使用它时,您正在将一个
新的
物种实例分配给一个变量

private Sepcies species = new Species() // wrong
private Species species = UIForm.species // possibly right
或者更好

private Species GetUISpecies()
{
    return UIForm.species;
}

对于第一个示例,您说您得到了一个
索引autofrangeexception
。这是因为该物种的实例大小数组中的元素少于两个

在第二个示例中,size数组至少有2个元素,这就是为什么您可以在该点访问索引1处的元素


结论是,在这两者之间的某个地方,可以使用更大的大小重新创建size数组,或者species变量最终指向不同的实例。通过调试器运行代码,查看它如何与物种变量/大小数组交互。

UIForm
类型吗?或者引用一个实例?因为
UIForm.species
如果类型为
UIForm
,则不应工作,因为
species
是一个实例字段,而不是静态警告:简单地将字段的可访问性更改为
public
几乎从来都不是正确的选择,这是对所问问题的答案。我不是来给你提建议的,我是来回答你提出的问题的。问题在第二个代码示例下面写着“我以UIForm公开了物种”。所有内容都设置为私有,您所写的任何内容都无法从定义它的类之外访问。@bizzehdee-您已经阅读了它,因为OP在Form1中创建了一个名为
species
的新变量,这是私有的,
UIForm。species
不是,这就是为什么它似乎对他们有效。我在我的示例中编写了private,以使它们在
Form1