【问题标题】:Why can't you call a non-static method from a static method?为什么不能从静态方法调用非静态方法?
【发布时间】:2011-03-02 08:31:59
【问题描述】:
我的类中有一个静态方法[Method1],它调用同一个类中的另一个方法[Method2],不是静态方法。但这是一个禁忌。我收到此错误:
需要一个对象引用
非静态字段、方法或
属性“ClassName.MethodName()”
有人可以简单描述一下原因吗?包括其他可能与此相关的事情。
【问题讨论】:
标签:
c#
class
static-methods
【解决方案1】:
非静态方法需要类的实例。除非您传入了一个实例,或者在您的方法中创建了一个实例,否则您不能调用非静态方法,因为您不知道该方法应该操作的类的哪个实例。
【解决方案2】:
在静态方法中,您没有该类的实例。所以在没有实例存在的情况下,不可能在实例上调用实例方法。
【解决方案3】:
为了调用非静态方法(即实例方法),您必须先拥有该方法的对象实例,然后才能调用所述方法。
你实际上想要做的是这个。请注意 Method1 中的 this 对象。您在静态方法中没有可用的 this。
static void Method1() {
this.Method2()
}
void Method2() { }
【解决方案4】:
你需要一个类的实例来调用非静态方法。您可以创建一个 ClassName 实例并像这样调用 Method2:
public class ClassName
{
public static void Method1()
{
ClassName c = new ClassName();
c.Method2();
}
public void Method2()
{
//dostuff
}
}
static 关键字基本上通过仅引用其类型 [ClassName] 将方法标记为可调用的。所有非静态方法都必须通过对象的实例来引用。
【解决方案5】:
因为“静态”方法就是所谓的“类方法”。也就是说,您可以在 C# 等基于类的语言中按类或按实例两种方式之一分派对象。非静态成员可以被其他非静态成员分派,相反,静态成员只能被其他静态成员调用。
请记住,您可以通过“新”机制从另一个访问另一个,反之亦然。
【解决方案6】:
根据定义,静态方法不提供对this 的访问。因此,它不能调用成员方法。
如果您尝试从静态方法调用的成员方法不需要this,则可以将其更改为静态方法。
【解决方案7】:
首先你需要创建类的实例以便调用非静态方法或函数。
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();
【解决方案8】:
静态成员只能直接访问该类的其他静态成员,静态方法不能直接访问同一类的非静态成员。
静态方法或属性只能直接调用同一类的其他静态方法或属性(即单独使用方法名称),并且只能直接操作同一类中的静态变量。
要访问类的非静态成员,静态方法或属性必须使用对该类对象的引用。回想一下,静态方法与整个类相关,而非静态方法与类的特定对象(实例)相关联,并且可以操纵该对象的实例变量(以及类的静态成员)。
一个类的许多对象,每个对象都有自己的实例变量副本,可能同时存在。假设一个静态方法要直接调用一个非静态方法。该方法如何知道要操作哪个对象的实例变量?如果在调用非静态方法时不存在类的对象会发生什么? Source
【解决方案9】:
简单的经验法则是:
静态方法/类/ctor可以永远 [使用/调用/调用/你到底是什么
命名动词] 调用非静态字段、属性或方法。但是,通过调用
实例化。