顶级语句-不使用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)
相关推荐
野犬寒鸦12 小时前
从零起步学习并发编程 || 第一章:初步认识进程与线程
java·服务器·后端·学习
我爱娃哈哈12 小时前
SpringBoot + Flowable + 自定义节点:可视化工作流引擎,支持请假、报销、审批全场景
java·spring boot·后端
李梨同学丶14 小时前
0201好虫子周刊
后端
思想在飞肢体在追14 小时前
Springboot项目配置Nacos
java·spring boot·后端·nacos
Loo国昌16 小时前
【垂类模型数据工程】第四阶段:高性能 Embedding 实战:从双编码器架构到 InfoNCE 损失函数详解
人工智能·后端·深度学习·自然语言处理·架构·transformer·embedding
ONE_PUNCH_Ge17 小时前
Go 语言泛型
开发语言·后端·golang
良许Linux17 小时前
DSP的选型和应用
后端·stm32·单片机·程序员·嵌入式
不光头强17 小时前
spring boot项目欢迎页设置方式
java·spring boot·后端
怪兽毕设18 小时前
基于SpringBoot的选课调查系统
java·vue.js·spring boot·后端·node.js·选课调查系统
学IT的周星星18 小时前
Spring Boot Web 开发实战:第二天,从零搭个“会卖萌”的小项目
spring boot·后端·tomcat