为什么主要是静态的?

时间:2012-07-04 16:08:33

标签: c#

我尝试在C#中创建public void Main();它说没有静态无效主要发现 Main静态到底意味着什么?我知道代码适用于public static void Main()

但为什么Main必须是static

6 个答案:

答案 0 :(得分:52)

您需要一个程序入口点。静态意味着您可以在不必实例化类的对象/实例的情况下调用该函数。它有点“鸡蛋和鸡蛋”......你不能在进入程序之前实例化一个对象。

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

正如David所说,您只需将关键字static添加到函数定义即可进行更改。值得研究静态(类)方法与实例方法,并且知道差异有时会很有用。

答案 1 :(得分:17)

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

查看C# language specification

  

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

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

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

注意:以上内容引自4th edition,现在标记为“历史”。目前的版本措辞不同。

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

答案 2 :(得分:3)

一个类中有两种类型的方法:

  1. 非静态方法
  2. 静态方法
  3. // 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接收可选的&#34;命令行&#34;程序运行的参数。

    <强> 2。非静态方法:

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

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

    // to call non-static method
    Test ob=new Test();
    ob.show();
    

答案 3 :(得分:1)

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

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

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个调用。然而,如果没有这样的协调方案,要求框架在运行之前构造应用程序对象并没有太大的好处。成本不会很高,但没有任何潜在的可识别的好处,接受甚至是微不足道的成本也没什么意义。

答案 4 :(得分:1)

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

static void Main(){..}

但也可以用标题声明:

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

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

答案 5 :(得分:0)

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