我刚开始学习C#(在Xamarin上),我对PHP的背景感到困惑。
我使用了一个全新的控制台项目模板, Program.cs中有一个类
using System;
namespace Test
{
class MainClass
{
public static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
}
按预期将 Hello World!写入控制台。但是类MainClass
从未被初始化。为什么要执行?
更改我的问题:谁执行了构造函数?
答案 0 :(得分:4)
主要方法是静态的,允许没有实例的呼叫。
答案 1 :(得分:3)
Main
是该计划的entry point。运行程序时,操作系统会为您调用Main
方法。由于static
是MainClass
方法,因此无需创建Main
的实例。
要成为有效的切入点,static
方法必须为void
且返回类型为int
或string[]
,且无参数或单{{1}参数。 (见:https://msdn.microsoft.com/en-us/library/acy3edy3.aspx)
如果您的计划中有多个Main
方法是有效的切入点,您可以选择使用哪个方法with compiler settings。
答案 2 :(得分:2)
但是类MainClass从未被初始化。为什么要执行
它并不需要,因为Main
是static
,正如其他人所指出的那样。
编译托管程序集时,其中有一个部分标题告诉.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