C#类无需初始化(或调用)即可工作

时间:2016-09-01 11:40:00

标签: c# .net

我刚开始学习C#(在Xamarin上),我对PHP的背景感到困惑。

我使用了一个全新的控制台项目模板, Program.cs中有一个类

using System;

namespace Test
{
    class MainClass
    {
    public static void Main(string[] args)
    {
    Console.WriteLine("Hello World!");
    }
    }
}

按预期将 Hello World!写入控制台。但是类MainClass从未被初始化。为什么要执行?

修改

更改我的问题:谁执行了构造函数?

7 个答案:

答案 0 :(得分:4)

主要方法是静态的,允许没有实例的呼叫。

答案 1 :(得分:3)

Main是该计划的entry point。运行程序时,操作系统会为您调用Main方法。由于staticMainClass方法,因此无需创建Main的实例。

要成为有效的切入点,static方法必须为void且返回类型为intstring[],且无参数或单{{1}参数。 (见:https://msdn.microsoft.com/en-us/library/acy3edy3.aspx

如果您的计划中有多个Main方法是有效的切入点,您可以选择使用哪个方法with compiler settings

答案 2 :(得分:2)

  

但是类MainClass从未被初始化。为什么要执行

它并不需要,因为Mainstatic,正如其他人所指出的那样。

编译托管程序集时,其中有一个部分标题告诉.NET运行时定义的Main方法在哪里,并设置为程序的入口点。您可以看到它打开托管.EXE为ILDASM

TypeDef #3 (02000004)
-------------------------------------------------------
TypDefName: ConsoleApplication1.Program  (02000004)
Flags     : [NotPublic] [AutoLayout] [Class] [AnsiClass] [BeforeFieldInit]  (00100000)
Extends   : 01000010 [TypeRef] System.Object
Method #1 (0600000c) [ENTRYPOINT] <--- This
-------------------------------------------------------
    MethodName: Main (0600000C)
    Flags     : [Private] [Static] [HideBySig] [ReuseSlot]  (00000091)
    RVA       : 0x000021cc
    ImplFlags : [IL] [Managed]  (00000000)
    CallCnvntn: [DEFAULT]
    ReturnType: Void
    1 Arguments
        Argument #1:  SZArray String
    1 Parameters
        (1) ParamToken : (0800000c) Name : args flags: [none] (00000000)

运行时负责调用Main方法。

如果您真的想了解运行时的初始化方式,请查看What happens when a .net application is started?

答案 3 :(得分:1)

主要方法是应用程序的入口。它不需要初始化。除了某些类(如static)之外,还需要初始化要在方法中使用的任何其他类。

答案 4 :(得分:1)

简单来说,你需要一个入口点(从OS)到你的code.so public static void Main(string [] args)作为入口点主线程,如果你看到java,c#,c ++所有程序范式遵循几乎相同的惯例。 下面就编译器而言 I)公众 - 任何人都可以访问 Ii)静态 - 不需要你创建实例,只能在分配m内存后直接调用 iii)void-向被调用函数(OS)返回空 iv)Main -unique函数名称,按照惯例,它是应用程序的入口点。

答案 5 :(得分:1)

map()方法指定应用程序的入口点。可以使用classname.methodname()语法访问此方法,因为它是静态方法。

答案 6 :(得分:1)

Main是C#入口点。它是负责执行程序的CLR。当编译为IL时,它被标记为 .entrypoint ,这是CLR用来识别要启动的方法的内容。

以下是代码 IL(中级语言)的快照

.class private auto ansi beforefieldinit Test.MainClass
   extends [mscorlib]System.Object
{
 .method public hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // Code size       13 (0xd)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "Hello World!"
  IL_0006:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_000b:  nop
  IL_000c:  ret
} // end of method MainClass::Main