我的类中有一个静态方法[Method1],它在同一个类中调用另一个方法[Method2],而不是静态方法。但这是禁忌。我收到这个错误:
需要对象引用 非静态字段,方法或 property“ClassName.MethodName()”
有人可以简单描述一下原因吗?包括可能与此相关的其他事情。
答案 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永远永远 [使用/调用/调用/到底是什么 为动词命名]调用非静态字段,属性或方法。但是,通过 实例。