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

Posted

技术标签:

【中文标题】C# 自己命名 Main() 方法的方法?【英文标题】:C# Way to name Main() method by yourself? 【发布时间】:2011-02-06 07:25:27 【问题描述】:

快速提问,有没有办法随心所欲地调用你的主要方法?还是必须叫“Main()”?

【问题讨论】:

这从来没有从我这里出现过,只是因为你在 Main() 中只能有一行,然后从那里调用你想要的任何东西。不过我对答案很感兴趣.. 除了好奇还有其他原因吗?有人说过这样的话:“如果调试的难度是编写新代码的两倍,那么根据定义,你还不够聪明,无法调试你能想出的‘最聪明’的代码。”破坏惯例就属于这一类。 【参考方案1】:

从 C# 9.0 开始,Main 方法是 no longer required:

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

using System;

Console.WriteLine("Hello World!");

允许任何声明。该程序必须在文件中的 usings 之后和任何类型或命名空间声明之前发生,并且您只能在一个文件中执行此操作,就像您今天只能有一个 Main 方法一样。

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

【讨论】:

【参考方案2】:

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

Main 方法是程序的入口点,程序控制在这里开始和结束。 它在类或结构中声明。它必须是静态的,并且不应该是公开的。 它可以具有 void 或 int 返回类型。 可以使用或不使用参数声明 Main 方法。 参数可以作为零索引的命令行参数读取。 与 C 和 C++ 不同,程序的名称不被视为第一个命令行参数。

【讨论】:

【参考方案3】:

来自“Main () and Other Methods (C# vs Java)”:

每个 C# 应用程序都必须包含一个 Main 方法,指定程序从哪里开始执行。

【讨论】:

【参考方案4】:

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

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

Main (C#)

【讨论】:

显然这是 C# 约定,而不是 .NET Framework 约定。【参考方案5】:

不,它必须被称为 Main。 See Main() and Command Line Arguments (C# Programming Guide).

【讨论】:

【参考方案6】:

我不相信有办法在 C# 方面做到这一点,但如果你愿意编辑你的 IL,那么很容易进入并将 .entrypoint 添加到 IL 中的函数中。查看***上的 CLI 条目。

【讨论】:

【参考方案7】:

请注意,这是 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
        
    

【讨论】:

非常感谢您的回答。真的很有趣 不客气,感谢您的赞誉。作为事后的想法,我想知道像 PostSharp 这样的工具是否可以将 IL (.entrypoint) 的适当部分注入到用特定属性装饰的方法中,从而避免需要命名为 Main 的入口点的 C#“限制” ()。【参考方案8】:

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

但实际上,你为什么要这样做?每个人都知道它是主要的......所以你会混淆其他可能会查看你的代码的开发人员

【讨论】:

【参考方案9】:

它必须被称为 Main。

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

public static void Main(String[] args)

    Mane(args);

【讨论】:

【参考方案10】:

必须调用 Main()。

【讨论】:

以上是关于C# 自己命名 Main() 方法的方法?的主要内容,如果未能解决你的问题,请参考以下文章

重命名命名空间后找不到为 Main 方法指定的“WindowsFormsApplication1.Program”

在 C# 中重命名目录 [关闭]

C#基础学习随笔记

谁有C#的命名规范

c#Ajax 的错误,应该如何解决?

C#笔记:C#程序基本内容