52

我尝试public void Main()在 C# 中创建;它说no static void Main found。静态
到底是什么意思?Main我知道代码适用于public static void Main().

但为什么Main一定要static呢?

4

6 回答 6

63

您需要一个进入程序的入口点。静态意味着您可以调用函数而无需实例化类的对象/实例。这有点“鸡和蛋”……在您进入程序之前,您无法实例化对象。

可以在不实例化对象的情况下调用静态方法。因此main()需要是静态的,以允许它成为您程序的入口。

正如大卫所说,您只需将关键字添加static到函数定义中即可更改它。值得研究静态(类)方法与实例方法,并且知道它们之间的区别有时会很有用。

于 2012-07-04T16:12:22.247 回答
19

只有静态 main 方法可以完成这项工作,因为有一个定义此行为的约定。没有其他原因。

看看C# 语言规范

应用程序启动发生在执行环境调用指定方法时,该方法称为应用程序的入口点。此入口点方法始终命名为Main,并且应具有以下签名之一:

     static void Main() {…}  
     static void Main(string[] args) {…}  
     static int Main() {…}  
     static int Main(string[] args) {…}

如图所示,入口点可以选择返回一个int值。此返回值用于应用程序终止(第 10.2 节)。

注:以上引自第4 版标为“历史”。当前版本的措辞不同。

除此之外,名称Main可以更改为其他名称。在这种情况下,必须添加一个编译器选项,告诉 C# 编译器将不同的方法标记为程序的入口点。

于 2012-07-04T17:42:54.793 回答
5

类中有两种类型的方法:

  1. 非静态方法
  2. 静态方法

// Example of static and non-static methods and how to call
namespace TestStaticVoidMain
{
    class Program
    {
        Static Void Main(string[] args)
        {
           // Instantiate or create object of the non-static method:
            Exam ob = new Exam();
            // Call the instance:
            ob.Test1();

            // Directly the call the static method by its class:
            Exam.Test2();

            Console.ReadKey();
        }
    }
    class Exam
    {
        public void Test1()
        {
            Console.WriteLine("This is a non-static method");
        }

        public static void Test2()
        {
            Console.WriteLine("This is a static method");
        }
    }
}

1.静态方法:

要调用静态方法(函数),我们不需要实例化或创建该方法的对象。我们不能使用new关键字,因为在加载和编译类时,static关键字默认实例化或创建该类方法的对象,所以我们直接调用静态方法。

关于参考static void Main(string[] args),我们已经讨论过了static。余数为void Main(string[] args)void是一种不返回任何内容的数据类型。Main()是执行 C# 程序的标准入口点。可选参数string[] args接收程序运行时使用的可选“命令行”参数。

2.非静态方法:

要调用非静态方法,我们必须实例化或创建类方法的对象,以使用关键字调用类的方法(函数)new

如果一个名为的类Test有一个名为的非静态方法show(),那么它将如何调用一个实例:

// to call non-static method
Test ob=new Test();
ob.show();
于 2014-08-04T10:53:33.773 回答
1

从概念上讲,框架可以指定不是使用特定的静态方法来运行程序,而是构造某个特定类的默认实例并在其上运行某些特定方法。如果一个框架通过让静态方法成为编译器初始化的单例实例的实例成员来实现静态方法,那么这种方法可能是完全合理的,因为无论如何框架都必须在调用主函数之前生成一个新的对象实例.

但是,如果调用静态方法比构造新对象实例并在其上调用方法“更容易”,那么要求框架使用更昂贵的操作过程并没有太多好处。任何想要使用后一种方法的代码都可以完全免费使用:

public static void Main( [[params]] )
{
  var mainObject = new MainObject();
  mainObject.Main( [[params]] );
}

让系统包含自己的静态方法可能会带来一些潜在的好处,如下所示:

public static void SysMain( [[params]] )
{
  using (Application app = new UserApp( [[params]] )) // UserApp derives from Application
  {
    app.Start(); // Virtual method
    app.AllowNext(); // Base method--see text
    app.Run(); // Abstract method
  }
}

app.AllowNext()一种方法可以与基本上同时启动的其他应用程序实例进行协调,以确保重复尝试在后台启动应用程序将Start严格按顺序处理它们的调用。然而,如果没有这样的协调方案,要求框架在运行之前构造一个应用程序对象并没有太大的好处。成本不会很大,但如果没有任何潜在的可识别利益,即使是微不足道的成本也没有多大意义。

于 2013-12-14T18:38:23.490 回答
0

main 应该是静态的,它首先加载并成为您程序的入口点,因此 main 是静态的至关重要。

于 2021-02-06T12:13:29.657 回答
0

在应用程序启动期间,当没有创建类的对象时,必须调用 Main 方法开始程序执行。Main 有时被称为应用程序的入口点。将 Main 声明为静态允许执行环境调用 Main 而无需创建类的实例。方法 Main 通常使用标头声明:

static void Main(){..}

但也可以用标题声明:

static void Main(string[] args){..}

您可以使用返回类型 int(而不是 void)声明 Main — 如果一个应用程序由另一个应用程序执行并且需要向另一个应用程序返回成功或失败的指示,这将很有用。

于 2018-02-26T10:51:24.057 回答