顶级语句-不使用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)
相关推荐
loading小马10 分钟前
解决idea2024版本Services栏没有显示Springboot窗口问题
java·spring boot·后端
好学且牛逼的马10 分钟前
Spring Boot 3 核心实战指南
java·spring boot·后端
却道天凉_好个秋14 分钟前
WebRTC(十五):NAT穿透机制深度解析
后端·webrtc·stun·turn·ice·net网络穿透
uzong17 分钟前
职场上要懂的思维模型系列(第一章)
后端
代码探秘者22 分钟前
【Redis】双写一致性:延迟双删 / 读写锁 / 异步通知 / Canal,一文全解
java·数据库·redis·后端·算法·缓存
IT枫斗者27 分钟前
CentOS 7 一键部署 K8s 1.23 + Rancher 2.7 完整指南
java·linux·spring boot·后端·kubernetes·centos·rancher
ding_zhikai32 分钟前
【Web应用开发笔记】Django笔记8:用户账户相关功能
笔记·后端·python·django
IMPYLH33 分钟前
Lua 的 UTF-8 模块
开发语言·笔记·后端·游戏引擎·lua
qq_124987075333 分钟前
基于springboot的个性化服装搭配推荐小程序(源码+论文+部署+安装)
spring boot·后端·spring·微信小程序·小程序·毕业设计·毕业设计源码
uzong37 分钟前
我们常常谈复盘,那么什么是真正的复盘
后端