在C#控制台应用程序中的“程序”类中,为什么所有方法都必须是静态的?
static void Main(string[] args)
成员函数不必须是静态的;但如果它们不是静态的,则需要实例化一个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
类,这可能是一个不太容易的任务。
你也可以编写非静态方法,只需像这样使用
static void Main(string[] args)
{
Program p = new Program();
p.NonStaticMethod();
}
C#应用程序的唯一要求是,可执行程序集应在程序集中的任何类中具有一个静态主方法!
主方法是静态的,因为它是程序集的代码入口点。一开始没有任何对象的实例,只有内存中加载的类模板及其静态成员,包括Main入口点静态方法。Main被C#编译器预定义为入口点。
静态方法只能调用其他静态方法(除非有用于组合使用的某些实例句柄)。这就是为什么Main方法调用其他静态方法以及为什么如果尝试调用非静态(实例)方法会出现编译错误。
但是,如果您创建任何类的实例,甚至是Program类本身的实例,那么您就开始在内存的堆区域中创建应用程序对象。然后您可以开始调用它们的实例成员。
并不是所有的方法都必须是静态的,您可以添加实例方法并创建一个Program类的实例。
但是对于Main方法,它必须是静态的,因为它是应用程序的入口点,没有人会创建实例并调用它。
所以,从技术上讲,正确的答案在上面 :)
我应该指出的是,通常你不想走所有静态方法的方向。创建一个对象,比如窗体,为它创建一个控制器,转向面向对象的代码而不是过程式的。
Program
类在内存方面是否明智?如果是一个大型程序,这听起来是一件糟糕的事情。 - MasterMastic