从静态函数引用非静态字段,反之亦然是不可能的吗?

B. *_*non 3 c# static dynamic winforms

我想以编程方式确定我想要动态创建的某些控件所拥有的空间。所以,我想获取容器的高度并将其除以行数(一个常量)。

我有这个函数(此代码是名为dynamicPanel的面板所在表单的一部分):

private static int getControlHeightToUse() {
  return (dynamicPanel.Height / NUMBER_OF_ROWS);
}
Run Code Online (Sandbox Code Playgroud)

...这给了我编译时错误,“*非静态字段、方法或属性需要对象引用 RememberNextGen_CRLogins.CRLoginsMainForm.dynamicPanel'*”

我不明白它想告诉我什么/它想要什么。

如果我删除“静态”:

private int getControlHeightToUse() {
  return (dynamicPanel.Height / NUMBER_OF_ROWS);
}
Run Code Online (Sandbox Code Playgroud)

...然后我收到编译时错误,“*字段初始值设定项无法引用非静态字段、方法或属性 'TitanNextGen_CRLogins.CRLoginsMainForm.getControlHeightToUse()'*”

...在下面指定的行上:

public partial class CRLoginsMainForm : Form {

  int controlHeight = getControlHeightToUse(); // <-- err
Run Code Online (Sandbox Code Playgroud)

Jam*_*are 5

方法static只能直接访问static类的成员,如果您想使用类的实例成员,则必须将类的实例传递给该方法(或者像static单例一样将其用作 a) 。

因此,您可以修改您的方法以接受阻止其成为静态的实例成员:

private static int getControlHeightToUse(Panel thePanel) 
{
  return (thePanel.Height / NUMBER_OF_ROWS);
}
Run Code Online (Sandbox Code Playgroud)

然后直接接dynamicPanel电话就可以了...

然而,实例方法可以访问static成员。请记住,static成员在所有实例之间共享,并且即使不存在该类的实例也存在。因此,他们无法调用实例成员,因为他们不知道您正在谈论哪个实例。