为什么静态方法只允许调用静态方法而不允许调用非静态方法



可能重复:
为什么我只能从静态函数访问静态成员?

当我试图从静态方法内部调用一个普通方法时,我得到了错误:

非静态字段、方法或属性需要对象引用

因此,这意味着我需要创建Class的对象,然后调用非静态方法。如果我想直接调用该方法,那么我必须将该方法声明为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

静态方法可以调用实例方法,但您需要有一个实例来调用它们。这个实例具体来自哪里并不重要,例如:

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;

这更有道理。

通常,实例方法使用或修改实例的状态

这样想吧。

静态方法是在一排电梯外按下按钮。任何人都可以看到它并推动它,然后做出一些事情(即其中一部电梯将到达该楼层(。

非静态方法是特定电梯内的按钮。他们操纵那部电梯(其他人都没有(。

非静态方法也称为实例方法。这意味着(通常(有一块数据,特定于该方法操作的实例(对象(

您不能从静态方法调用非静态或实例方法,因为它不知道要对哪个实例或对象进行操作。

因为没有实例可以从中调用方法。你应该创建另一个类并测试它:

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;
    }
}

您了解实例方法和静态方法之间的区别吗?

实例方法可以访问this对象,即使它不是作为参数传入的,事实上,它就像是框架为您传递的同一类的不可见参数。

静态方法没有那个this对象,并且不能调用实例方法,因为它没有任何东西可以以不可见的方式传递给那个this。。。

听起来像个笑话,但我是这样看的:(

最新更新