.NET9里面Main另类写法

💡 原文中文,约1200字,阅读约需3分钟。
📝

内容提要

本文讨论了在.NET控制台程序中,Main函数的返回值可以是不同类型的变体,包括int、byte、char和string等。这是由于CLR在调用Main入口时使用了一套逻辑,根据Main的MethodDesc是否为void类型来确定返回值类型。此外,文章还提到了在.NET4.8.1版本中也可以使用类似的写法。

🔎

延伸解读

CLR 入口调用逻辑

文章指出,CLR 在调用 Main 入口时通过 if-else 逻辑判断 Main 的 MethodDesc 是否为 void 类型。如果是 void,则直接调用并将返回值设为 0;否则通过 Call_RetArgSlot 获取返回值并设置退出代码。这解释了为何 Main 可以返回 int、byte、char、string 等多种类型,而不仅限于 void 或 int。

Program 类型与 Main 返回值的灵活性

常规控制台程序将 Program 定义为类(引用类型),但文章提到可以改为 struct(值类型),同时 Main 的返回值也可从 void 改为 int、byte、char、string 等。这种灵活性源于 CLR 对入口方法的处理方式,并不要求 Program 必须是类或 Main 必须返回 void。

跨版本兼容性

文章作者在 .NET 4.8.1 上实践后发现,类似的 Main 返回值类型写法同样可用。这表明该特性并非 .NET 9 独有,而是 CLR 长期支持的机制,只是较少被提及。读者在旧版本框架中也可尝试,但需注意实际行为可能受具体运行时实现影响。

❓

Q&A

.NET控制台程序的Main函数可以返回哪些类型?

Main函数可以返回int、byte、char和string等类型。

CLR是如何判断Main函数的返回值类型的?

CLR通过判断Main的MethodDesc是否为void类型来确定返回值类型。

在.NET4.8.1中,Main函数的返回值类型有什么变化吗?

在.NET4.8.1中,Main函数的返回值类型与.NET9类似,也支持多种类型的返回值。

使用值类型的Program结构体时,Main函数的返回值有什么要求?

使用值类型的Program结构体时,Main函数可以返回int类型。

Main函数的返回值可以是void吗?

是的,Main函数的返回值可以是void类型。

CLR如何处理Main函数的返回值?

CLR通过if-else结构来处理Main函数的返回值,根据返回值类型进行相应的逻辑处理。

🏷️

标签

➡️

继续阅读