C#自己命名Main()方法的方法?

C#自己命名Main()方法的方法?,c#,main,C#,Main,快速提问,有没有一种方法可以随意调用你的主要方法?或者它必须被称为“Main()”?不,它必须被称为Main 它必须被称为Main()。它需要被称为Main(),因为它是应用程序的入口点 名称和限制由框架定义。以下是MSDN页面供参考: 它必须被称为Main 如果您真的愿意,您可以创建自己的方法,并将其作为Main中唯一的一行代码来调用 public static void Main(String[] args) { Mane(args); } 没有。。。主要是标准。但您可以做的是从项

快速提问,有没有一种方法可以随意调用你的主要方法?或者它必须被称为“Main()”?

不,它必须被称为Main

它必须被称为Main()。

它需要被称为
Main()
,因为它是应用程序的入口点

名称和限制由框架定义。以下是MSDN页面供参考:


它必须被称为Main

如果您真的愿意,您可以创建自己的方法,并将其作为Main中唯一的一行代码来调用

public static void Main(String[] args)
{
    Mane(args);
}

没有。。。主要是标准。但您可以做的是从项目属性的“启动对象”设置中更改承载主方法的类

但真的,你为什么要这么做?每个人都知道这是主要的。。。因此,您可能会让其他可能从“”查看您的代码的开发人员感到困惑:

每个C#应用程序都必须包含一个指定程序执行开始位置的主方法


您可以将main方法调用为其他方法,但它不会作为应用程序中的第一个方法调用,除非它被调用为
main
。还有一些其他的要求和注意事项。发件人:

  • Main方法是程序的入口点,程序控件从这里开始和结束
  • 它在类或结构中声明。它必须是静态的,不应该是公共的
  • 它可以具有void或int返回类型
  • Main方法可以声明为带参数或不带参数
  • 参数可以读取为零索引命令行参数
  • 不像C和C++,程序的名称不被当作第一个命令行参数。
注意这是一个C#约定,而不是.NET运行时约定。您可以在IL中随意命名您的方法:

.module Mane.exe
.subsystem 3
.corflags 9

.assembly extern mscorlib
{
  .publickeytoken = (B7 7A 5C 56 19 34 E0 89)
  .ver 2:0:0:0
}

.assembly Mane
{
    .custom instance void [mscorlib]System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = ( 01 00 00 00 00 ) 
    .custom instance void [mscorlib]System.CLSCompliantAttribute::.ctor(bool) = ( 01 00 01 00 00 ) 
    .custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = ( 01 00 07 31 2E 30 2E 30 2E 30 00 00 )
    .custom instance void [mscorlib]System.Resources.NeutralResourcesLanguageAttribute::.ctor(string) = ( 01 00 05 65 6E 2D 55 53 00 00 )

    .permissionset reqmin
               = {[mscorlib]System.Security.Permissions.SecurityPermissionAttribute = {property bool 'Execution' = bool(true)}}
    .hash algorithm 0x00008004
    .ver 1:0:0:0
}

.namespace Mane
{
    .class private abstract auto ansi sealed beforefieldinit Program extends [mscorlib]System.Object
    {
        .method private hidebysig static void Mane() cil managed
        {
            .entrypoint
            .maxstack 1
            ldstr "Hello, World!"
            call void [mscorlib]System.Console::WriteLine(class System.String)
            ret
        }
    }
}

我不相信有一种方法可以做到这一点,但如果你愿意编辑你的IL,就很容易进入并添加。入口指向IL中的函数。查看wikipedia上的CLI条目。

从C#9.0开始,一个
Main
方法是:

在C#9.0中,您可以选择在顶层编写主程序:

using System;

Console.WriteLine("Hello World!");
任何声明都是允许的。程序必须在使用s的
之后和文件中的任何类型或命名空间声明之前执行,并且您只能在一个文件中执行此操作,就像您现在只能有一个
Main
方法一样


这将节省一些样板代码,对于快速控制台程序测试某些内容非常有用,但对于更严重的问题,我仍然建议使用
Main
;如果您正在寻找程序的入口点,在整个解决方案中搜索
Main(
)很容易,但搜索缺少名称空间/类/方法就不那么容易了。

我从来没有想到过这一点,因为Main()中只能有一行我对答案很感兴趣。除了好奇之外,还有其他原因吗?有人引用了这样一句话:“如果调试的难度是编写新代码的两倍,那么根据定义,你还不够聪明,无法调试出“最聪明”的代码。”打乱约定完全属于这一类。显然这是一个C#约定,而不是.NET框架约定。谢谢你回答得很好。真的很有趣,非常欢迎你,谢谢你的赞誉。事后想想,我想知道像PostSharp这样的工具是否可以注入IL(.entrypoint)的适当部分进入一个用特定属性修饰的方法,从而消除了需要命名为Main()的入口点的C#“限制”。