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

本文关键字:不可能 反之亦然 字段 静态函数 引用 静态 | 更新日期: 2023-09-27 18:31:52

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

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

private static int getControlHeightToUse() {
  return (dynamicPanel.Height / NUMBER_OF_ROWS);
}

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

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

如果我删除"静态":

private int getControlHeightToUse() {
  return (dynamicPanel.Height / NUMBER_OF_ROWS);
}

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

。在下面指示的行上:

public partial class CRLoginsMainForm : Form {
  int controlHeight = getControlHeightToUse(); // <-- err

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

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

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

private static int getControlHeightToUse(Panel thePanel) 
{
  return (thePanel.Height / NUMBER_OF_ROWS);
}

然后只需在通话中传入dynamicPanel...

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

将动态面板作为参数传递给静态方法

public partial class CRLoginsMainForm : Form {
  int controlHeight = getControlHeightToUse(dynamicPanel);

更改获取控件高度以使用如下所示

private static int getControlHeightToUse(Panel panel) {
  return (panel.Height / NUMBER_OF_ROWS);
}

如果要从静态方法调用非静态方法,可以执行以下操作

public class Foo
{
    // public method 
    public void Method1()
    {
    }
    public static void Data2()
    {
        // call public method from static method
        new Foo().Method1();
    }
}