前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >.NET9里面Main另类写法

.NET9里面Main另类写法

作者头像
江湖评谈
发布2024-07-04 11:20:09
290
发布2024-07-04 11:20:09
举报
文章被收录于专栏:天下风云天下风云

前言

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

Program+Main

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

代码语言:javascript
复制
class Program
{

    static void Main(string[] args)
    { 

    }
}

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

代码语言:javascript
复制
struct Program
{

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

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

代码语言:javascript
复制
 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专属独加的功能,只不过个人最近才发现,而之前较少为人提及罢了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 江湖评谈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • Program+Main
    • 结尾
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档