为什么在C#,控制台应用程序中,在“程序”类中,默认情况下,所有方法都必须是静态的
static void Main(string[] args)
答案 0 :(得分:63)
成员函数 不是静态的;但如果它们不是静态的,则需要您实例化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 :(得分:23)
您也可以编写非静态方法,只需使用这样的
static void Main(string[] args)
{
Program p = new Program();
p.NonStaticMethod();
}
C#应用程序的唯一要求是可执行程序集在程序集的任何类中都应该有一个静态main方法!
答案 2 :(得分:11)
Main方法是静态的,因为它是程序集的代码入口点。最初没有任何对象的实例,只有内存中加载的类模板及其静态成员,包括Main入口点静态方法。 Main是由C#编译器预定义的入口点。
静态方法只能调用其他静态方法(除非有一个合成使用的实例句柄)。这就是为什么Main方法调用其他静态方法以及为什么在尝试调用非静态(实例)方法时出现编译错误的原因。
但是,如果您创建任何类的实例,甚至是Program类本身的实例,那么您将开始在应用程序的堆内存区域中创建对象。然后,您可以开始调用其实例成员。
答案 3 :(得分:5)
并非所有方法都必须是静态的,您可以添加实例方法并创建Program类的实例 但是对于Main来说它必须是静态的,因为它是你的应用程序的入口点,没有人会创建一个实例并调用它。
答案 4 :(得分:1)
因此,技术上正确的答案如上:)
我应该指出,通常你不想走向所有静态方法的方向。创建一个对象,比如windows窗体,一个控制器,然后转向面向对象的代码而不是程序。