顶级语句-不使用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)
相关推荐
绝无仅有33 分钟前
京东面试题解析:SSO、Token与Redis交互、Dubbo负载均衡等
后端·面试·github
懒惰蜗牛34 分钟前
Day44 | J.U.C中的LockSupport详解
java·开发语言·后端·java-ee
Mintopia42 分钟前
🧠 Next.js 还是 Nuxt.js?——当 JavaScript 碰上命运的分叉路
前端·后端·全栈
nexttake2 小时前
5.go-zero集成gorm 和 go-redis
开发语言·后端·golang
Victor3562 小时前
Redis(84)如何解决Redis的缓存击穿问题?
后端
Victor3562 小时前
Redis(85)Redis缓存与Memcached缓存有何区别?
后端
lang201509282 小时前
Spring Bean作用域全解析
java·后端·spring
IT_陈寒2 小时前
Vue3性能提升30%的秘密:5个90%开发者不知道的组合式API优化技巧
前端·人工智能·后端
程序员爱钓鱼7 小时前
Python编程实战 · 基础入门篇 | 元组(tuple)
后端·python·ipython
程序员爱钓鱼7 小时前
Python编程实战 · 基础入门篇 | 列表(list)
后端·python·ipython