可能重复:
Why can I only access static members from a static function?
当我试图从静态方法中调用普通方法时,我得到了错误:
非静态字段,方法或属性
需要对象引用
所以这意味着我需要创建Class的对象然后调用nonstatic方法。如果我想直接调用该方法,那么我必须将该方法声明为Static。
但是,在这种情况下,调用方法和被调用方法属于同一个类。那么为什么我需要在从静态方法调用时创建一个对象,而我可以从非静态方法调用一个非静态方法。
例如:
class Program
{
//public void outTestMethod(int x,out int y)
//{
// y = x;
//}
static void Main(string[] args)
{
int a = 10;
int b = 100;
outTestMethod(a,out b);
}
private void outTestMethod(int x, out int y)
{
y = x;
}
}
Error:An object reference is required for the non-static field, method, or property
答案 0 :(得分:6)
静态方法可以调用实例方法 - 但是你需要有一个实例来调用它们。这个实例来自哪里并不重要,例如:
int a = 10;
int b = 100;
Program program = new Program();
program.outTestMethod(a,out b);
实例方法与类型的特定实例相关联,而静态方法则与整体类型相关联 - 对于其他类型的成员也是如此。因此,要调用实例方法,您需要知道您感兴趣的实例。例如,拥有它将毫无意义:
string name = Person.Name;
因为您需要知道您正在谈论的人:
Person person = FetchPersonFromSomewhere();
string name = person.Name;
......这更有意义。
通常,实例方法使用或修改实例的 state 。
答案 1 :(得分:4)
以这种方式考虑。
静态方法是电梯外的按钮。任何人都可以看到并推动它,并使某些事情发生(即其中一部电梯将到达该楼层)。
非静态方法是特定电梯内的按钮。他们操纵那台电梯(而不是其他电梯)。
答案 2 :(得分:1)
非静态方法也称为实例方法。这意味着(通常)是一个数据块,特定于该方法操作的实例(对象)。
您不能从静态方法调用非静态方法或实例方法,因为它不知道要操作哪个实例或对象。
答案 3 :(得分:0)
因为没有实例来调用该方法。你应该创建另一个类并测试它:
class Program
{
static void Main(string[] args)
{
int a = 10;
int b = 100;
Test testclass = new Test();
testclass.outTestMethod(a,out b);
}
}
class Test
{
public void outTestMethod(int x, out int y)
{
y = x;
}
}
答案 4 :(得分:0)
你了解实例方法和静态方法之间的区别吗?
实例方法可以访问this
对象,即使它没有作为参数传入,实际上它就像它是框架为您传递的相同类型的类型的不可见参数。 / p>
静态方法没有this
对象,也无法调用实例方法,因为它没有以隐形方式为this
传递任何内容......
听起来像个笑话,但这是我看到它的方式:)