main静态方法为什么不能直接调用非静态方法、字段或属性

2020-02-16  本文已影响0人  向着远方奔跑

问题:

class Program
{
    public void Greet(string name) //动态方法
    {
        Console.WriteLine("早上好," + name);
    }

    static void Main(string[] args) //静态方法
    {
        Greet("bobo"); //报错:对象对于非静态的字段、方法或属性“Program.Greet(string)”是必需的
    }
}

如上例所示,主函数Main函数为静态方法,当在其方法内部直接调用本类Program中的动态方法Greet时,编辑器会报错提示 :

对象对于非静态的字段、方法或属性“Program.Greet(string)”是必需的**

意思是静态方法中不能直接引用动态方法,为什么呢???

解析

首先我们需要搞清楚静态方法和动态方法的区别:

静态方法是类的成员,创建后储存在内存中,占内存,但调用速度块,又叫类方法

动态方法不是类的成员,要调用必须先声明类的实例(也就是new一个类)后,通过类的实例调用,调用完后,立即释放类,节省内存。

此例中静态方法main不能在自己的方法中直接调用本类中的动态方法Greet,我们可以想想如果系统允许调用,会发生什么:

如果静态方法Main中可以直接调用动态方法Greet,当Program类外部的一个类,通过Program直接调用Main(因为Main是静态方法,可以通过当Program类调用),也就相当于可以调用静态方法Main中的动态方法Greet了,而不需要对类进行实例化,这种调用在系统运行时也会报异常,因此为防止更多异常发生,系统选择在编译阶段一开始就禁止使用此种调用,提前发现并规避错误。

方案

问题的原因已经搞明白了,解决方案也就不言而喻了,当我们想要在静态方法中调用动态方法时,需要对类进行实例化,再通过类来调用
代码如下:

class Program
{
    public void Greet(string name) //动态方法
    {
        Console.WriteLine("早上好," + name);
    }

    static void Main(string[] args) //静态方法
    {
        new Program().Greet("bobo"); 
    }
}

或者本例中就是要调用Greet方法,也可将Greet方法改为静态方法,就可以直接进行调用了
代码如下:

class Program
{
    public static void Greet(string name) //改为静态方法
    {
        Console.WriteLine("早上好," + name);
    }

    static void Main(string[] args) //静态方法
    {
        Greet("bobo"); //直接调用
    }
}

上述讲了静态方法,静态变量和属性的原理与方法类似

上一篇 下一篇

猜你喜欢

热点阅读