顶级语句-不使用Main方法的程序

无需在控制台应用程序项目中显示包含Main方法。相反,可以使用顶级语句功能最大程度的减少必须编写的代码。

使用顶级语句可直接在文件的根目录中编写可执行代码,而无需在类或方法中包装代码。这意味着无需使用Program类和Main方法即可创建程序。在这种情况下,编译器将使用入口方法为应用程序生成Program类。生成方法的名称不是Main,而是你的代码无法直接引用的实现详细信息。 下面是一个Program.cs文件,看它是C# 10中的一个完整C#程序:

c# 复制代码
Console.WriteLine("Hello World!");

借助顶级语句,可以为小实用程序(如 Azure Functions 和 GitHub Actions)编写简单的程序。它们还使初次接触C#的程序员能够更轻松地开始学习和编写代码。 以下各节介绍了可对顶级语句执行和不能执行的操作的规则。

仅能有一个顶级文件

一个应用程序只能有一个入口点。一个项目只能有一个包含顶级语句的文件。在项目中的多个文件中放置顶级语句会导致以下编译器错误:

C# 复制代码
CS7022:程序的入口点是全局代码;忽略"Main()"入口点

在具有顶级语句的项目中,不能使用-main编译器选项来选择入口点,即使该项目具有一个或多个Main方法。

using指令

如果包含using指令,这些指令必须先出现在文件中,如以下示例中所示:

C# 复制代码
using System.Text;
StringBuilder builder = new(); 
builder.AppendLine("The following arguments are passed:"); // Display the command line arguments using the args variable. 
foreach (var arg in args) 
{
    builder.AppendLine($"Argument={arg}");
} 
Console.WriteLine(builder.ToString());
// Return a success code.
return 0;

全局命名空间

顶级语句隐式位于全局命名空间中。

命名空间和类型定义

具有顶级语句的文件还可以包含命名空间和类型定义,但它们必须位于顶级语句之后。例如:

C# 复制代码
MyClass.TestMethod();
MyNamespace.MyClass.MyMethod();

public class MyClass {
    public static void TestMethod()
    {
        Console.WriteLine("Hello World!");
    }
}

namespace MyNamespace
{
    class MyClass
    {
        public static void MyMethod()
        {
            Console.WriteLine("Hello World from MyNamespace.MyClass.MyMethod!");
        }
    }
}

args

顶级语句可以引用args变量来访问输入的任何命令行参数。args变量永远不会为null,但如果未提供任何命令行参数,则其Length将为零。例如:

C# 复制代码
if(args.Length > 0)
{
    foreach(var arg in args)
    {
        Console.WriteLine($"Argument={arg}");
    }
}
else
{
    Console.WriteLine("No arguments");
}

await

可以通过使用await来调用异步方法。例如:

C# 复制代码
Console.Write("Hello ");
await Task.Delay(5000);
Console.WriteLine("World!");

进程的退出代码

若要在应用程序结束时返回int值,请像在Main方法中返回int那样使用return语句。例如:

C# 复制代码
string? s=Console.ReadLine();

int returnValue=int.Parse(s??"-1");
return returnValue;

隐式入口点方法

编译器会生成一个方法,作为具有顶级语句的项目的程序入口点。方法的签名取决于顶级语句是包含await关键字还是return语句。下表显示了方法签名的外观,为了方便起见,在表中使用了方法名称Main。

顶级代码包含 隐式 Main 签名
await 和 return static async Task<int> Main(string[] args)
await static async Task Main(string[] args)
return static int Main(string[] args)
否 await 或 return static void Main(string[] args)
相关推荐
深蓝AI5 小时前
Python 3.13 的 Queue.shutdown:异步消费者终于能正常收工了
后端
武子康6 小时前
MultiNet6 空闲崩溃:`EXCVADDR=0x8` 后又出现 `CORRUPT HEAP`
人工智能·后端·agent
武子康7 小时前
MultiNet7 每轮都 clean,ESP32-P4 内存为什么还在掉?
人工智能·后端·agent
超级架构师7 小时前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core
陈随易8 小时前
AI 运维服务器,安全又可靠的方法
前端·后端·程序员
IT_陈寒9 小时前
JavaScript的this坑人实录,这次我真的记下来了
前端·人工智能·后端
starzy199010 小时前
Scala类和对象:从构造器到样例类的完整指南
开发语言·后端·scala
梦影_10 小时前
MySQL进阶教程(五)—— SQL调优(下)
android·大数据·数据库·后端·sql·mysql·database
考虑考虑10 小时前
mariadb数据库
数据库·后端·mariadb
明月_清风10 小时前
用自然语言操控真机:Google Artemis 移动端 AI Agent 上手与实践
人工智能·后端