顶级语句-不使用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 签名
awaitreturn static async Task<int> Main(string[] args)
await static async Task Main(string[] args)
return static int Main(string[] args)
awaitreturn static void Main(string[] args)
相关推荐
爱装代码的小瓶子5 小时前
【C++与Linux基础】进程间通讯方式:匿名管道
android·c++·后端
程序员良许6 小时前
嵌入式处理器架构
后端·单片机·嵌入式
MrSYJ6 小时前
Redis 做分布式 Session
后端·spring cloud·微服务
Cache技术分享6 小时前
318. Java Stream API - 深入理解 Java Stream 的中间 Collector —— mapping、filtering 和 fla
前端·后端
Elieal6 小时前
SpringBoot 数据层开发与企业信息管理系统实战
java·spring boot·后端
Coder_Boy_6 小时前
Java开发者破局指南:跳出内卷,借AI赋能,搭建系统化知识体系
java·开发语言·人工智能·spring boot·后端·spring
独自破碎E6 小时前
BISHI23 小红书推荐系统
java·后端·struts
gustt6 小时前
构建全栈AI应用:集成Ollama开源大模型
前端·后端·ollama
千寻girling6 小时前
《 MongoDB 教程 》—— 不可多得的 MongoDB
前端·后端·面试
Wiittch6 小时前
HashMap源码深度剖析
后端