为什么不能从静态方法调用非静态方法?

时间:2010-06-10 19:22:13

标签: c# class static-methods

我的类中有一个静态方法[Method1],它在同一个类中调用另一个方法[Method2],而不是静态方法。但这是禁忌。我收到这个错误:

  

需要对象引用   非静态字段,方法或   property“ClassName.MethodName()”

有人可以简单描述一下原因吗?包括可能与此相关的其他事情。

9 个答案:

答案 0 :(得分:24)

非静态方法需要类的实例。除非您已经传入实例,或者在方法中创建了一个实例,否则不能调用非静态方法,因为您不知道该方法应该对哪个类实例进行操作。

答案 1 :(得分:2)

在静态方法中,您没有该类的实例。因此,当没有实例存在时,无法在实例上调用实例方法。

答案 2 :(得分:1)

为了调用非静态方法(即实例方法),您必须先拥有该方法的对象实例,然后才能调用所述方法。

你实际上要做的是这个。请注意Method1中的this对象。您没有静态方法中的this

static void Method1() {
   this.Method2()
}

void Method2() { }

答案 3 :(得分:1)

您需要类类的实例来调用非静态方法。您可以创建一个ClassName实例并像这样调用Method2:

public class ClassName
{
    public static void Method1()
    {
        ClassName c = new ClassName();
        c.Method2();
    }

    public void Method2()
    {
        //dostuff
    }
}

static关键字基本上通过仅引用其类型[ClassName]将方法标记为可调用。必须通过对象的实例引用所有非静态方法。

答案 4 :(得分:0)

因为“静态”方法就是所谓的“类方法”。也就是说,您可以通过类或实例在基于类的语言(如C#)中以两种方式之一调度对象。非静态成员可以被其他非静态成员分派,相反,静态成员只能被称为其他静态成员。

请记住,您可以通过“新”机制与另一方达成一致,反之亦然。

答案 5 :(得分:0)

根据定义,静态方法无法访问this。因此,它无法调用成员方法。

如果您尝试从静态方法调用的成员方法不需要 this,则可以将其更改为静态方法。

答案 6 :(得分:0)

首先,您需要创建类的实例,以便调用非静态方法或函数。

public class ClassHelper()
{
   public static ClassHelper GetInstance()
    {
        ClassHelper instance = null;

        if (System.Web.HttpContext.Current == null)
        {
            instance = new ClassHelper();
            return instance;
        }

        if (System.Web.HttpContext.Current.Application["CLASSHELPER_INSTANCE"] == null)
        {
            instance = new ClassHelper();
            System.Web.HttpContext.Current.Application["CLASSHELPER_INSTANCE"] = instance;
        }

        instance = (ClassHelper)System.Web.HttpContext.Current.Application["CLASSHELPER_INSTANCE"];

        return instance;
    }


   public string Test()
   {
       return "test123";
   }

}

然后您可以按如下方式调用该函数:

textBox1.Text = ClassHelper.GetInstance().Test();

答案 7 :(得分:0)

静态成员只能直接访问Class的其他静态成员,而静态方法无法直接访问同一类的非静态成员。

静态方法或属性可以直接调用同一类的其他静态方法或属性(即,单独使用方法名称),并且只能直接操作同一类中的静态变量。

要访问类的非静态成员,静态方法或属性必须使用对该类对象的引用。回想一下,静态方法与一个类作为一个整体相关,而非静态方法与该类的特定对象(实例)相关联,并且可能操纵该对象的实例变量(以及该类的静态成员)。 p>

类的许多对象可能同时存在,每个对象都有自己的实例变量副本。假设一个静态方法直接调用非静态方法。该方法如何知道要操作哪个对象的实例变量?如果在调用非静态方法时没有类的对象,会发生什么? Source

答案 8 :(得分:0)

简单的经验法则是:

  

静态方法/类/ ctor永远永远 [使用/调用/调用/到底是什么   为动词命名]调用非静态字段,属性或方法。但是,通过   实例