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

Sim*_*ons 3 .net c# oop static-methods

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

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

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

所以这意味着我需要创建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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Error:An object reference is required for the non-static field, method, or property

Jon*_*eet 7

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

int a = 10;
int b = 100;
Program program = new Program();
program.outTestMethod(a,out b);
Run Code Online (Sandbox Code Playgroud)

实例方法与类型的特定实例相关联,而静态方法则与整体类型相关联 - 对于其他类型的成员也是如此.因此,要调用一个实例方法,你需要知道哪些你实例兴趣.例如,这将是毫无意义的有:

string name = Person.Name;
Run Code Online (Sandbox Code Playgroud)

因为你需要知道哪些你正在谈论的人:

Person person = FetchPersonFromSomewhere();
string name = person.Name;
Run Code Online (Sandbox Code Playgroud)

......这更有意义.

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


Ste*_*ton 5

这样考虑。

静态方法是电梯组外的按钮。任何人都可以看到它并推动它,并使某些事情发生(即其中一部电梯将到达该楼层)。

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