C#:控制台应用程序 - 静态方法

47
在C#控制台应用程序中的“程序”类中,为什么所有方法都必须是静态的?
static void Main(string[] args)
5个回答

67

成员函数不必须是静态的;但如果它们是静态的,则需要实例化一个Program对象才能调用成员方法。

使用静态方法:

public class Program
{
    public static void Main()
    {
        System.Console.WriteLine(Program.Foo());
    }

    public static string Foo()
    {
        return "Foo";
    }
}

不使用静态方法(也就是需要实例化Program类):

public class Program
{
    public static void Main()
    {
        System.Console.WriteLine(new Program().Foo());
    }

    public string Foo() // notice this is NOT static anymore
    {
        return "Foo";
    }
}

Main 必须是静态的,否则你就必须告诉编译器如何实例化 Program 类,这可能是一个不太容易的任务。


1
实例化Program类在内存方面是否明智?如果是一个大型程序,这听起来是一件糟糕的事情。 - MasterMastic

26

你也可以编写非静态方法,只需像这样使用

static void Main(string[] args)
{
    Program p = new Program();
    p.NonStaticMethod();
}

C#应用程序的唯一要求是,可执行程序集应在程序集中的任何类中具有一个静态主方法!


11

主方法是静态的,因为它是程序集的代码入口点。一开始没有任何对象的实例,只有内存中加载的类模板及其静态成员,包括Main入口点静态方法。Main被C#编译器预定义为入口点。

静态方法只能调用其他静态方法(除非有用于组合使用的某些实例句柄)。这就是为什么Main方法调用其他静态方法以及为什么如果尝试调用非静态(实例)方法会出现编译错误。

但是,如果您创建任何类的实例,甚至是Program类本身的实例,那么您就开始在内存的堆区域中创建应用程序对象。然后您可以开始调用它们的实例成员。


5

并不是所有的方法都必须是静态的,您可以添加实例方法并创建一个Program类的实例。
但是对于Main方法,它必须是静态的,因为它是应用程序的入口点,没有人会创建实例并调用它。


1

所以,从技术上讲,正确的答案在上面 :)

我应该指出的是,通常你不想走所有静态方法的方向。创建一个对象,比如窗体,为它创建一个控制器,转向面向对象的代码而不是过程式的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接