从静态函数引用非静态字段,反之亦然?

时间:2012-04-20 18:31:48

标签: c# winforms dynamic static

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

我已经有了这个函数(这段代码是名为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

2 个答案:

答案 0 :(得分:4)

static方法只能直接访问该类的static个成员,如果要使用该类的实例成员,则必须将该类的实例传入该方法(或有一个可用作单身人士的static

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

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

然后在通话中传递dynamicPanel ......

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

答案 1 :(得分:2)

将dynamicPanel作为参数传递给静态方法

public partial class CRLoginsMainForm : Form {

  int controlHeight = getControlHeightToUse(dynamicPanel);

将getControlHeightToUse更改为如下

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();

    }
}