.NET9里面Main另类写法

点击上方蓝字 江湖评谈设为关注/星标

25cfceb6360ef49f4aea76f66635da21.png

前言

在一些Soure Code看到有部分函数(比如Main)多变体类型返回,及其所在类型变化等。较高的自由度,本篇来看下。

Program+Main

一个新建的常规.NET控制台程序如下:

class Program
{


    static void Main(string[] args)
    { 


    }
}

注意看Program是个类,即引用类型,但它可以写成struct值类型。Main函数的返回值是void,但它的返回值可以写成int类型,byte,char,string类型。比如说值类型的Program,以及返回int的类型,如下代码:

struct Program
{


    static int Main(string[] args)
    { 
    
    }
}

这种情况得益于CLR调用Main入口的时候的一套逻辑,即if----else。CLR会判断Main的MethodDesc是否是void类型,如果是则if。否则就可以有其其它的返回类型,这个其它返回类型众多,也即是上面所说。此段逻辑代码:

if(pParam->pFD->IsVoid())
 {
     // Set the return value to 0 instead of returning random junk
     *pParam->piRetVal = 0;
     threadStart.Call(&stackVar);
 }
 else
 {
     *pParam->piRetVal = (INT32)threadStart.Call_RetArgSlot(&stackVar);
     SetLatchedExitCode(*pParam->piRetVal);
 }

结尾

值类型的和引用类型的方法分别都可以通过 threadStart.Call以及threadStart.Call_RetArgSlot进行调用。

后面继续实践了下其它版本,比如.NET4.8.1。发现它也是可以按照如上的一些写法使用,可以看到这不是.NET9专属独加的功能,只不过个人最近才发现,而之前较少为人提及罢了。

往期精彩回顾

.NET9 GC标记原理(超核技术)

.NET9异常(CLR)原理(顶阶技术

ff1166ce94dc3d498dd168a6ef4e9ed4.jpeg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值