當前位置: 妍妍網 > 碼農

.NET9裏面Main另類寫法

2024-06-22碼農

點選上方 藍字 江湖評談 設為關註/星標




前言

在一些Soure Code看到 有部份 函式(比如Main)多變體型別返回,及其所在型別變化等。較高的自由度,本篇來看下。

Program+Main

一個新建的常規.NET控制台程式如下:

classProgram{staticvoidMain(string[] args) }}

註意看Program是個類,即參照型別,但它可以寫成struct值型別。Main函式的返回值是void,但它的返回值可以寫成int型別,byte,char,string型別。比如說值型別的Program,以及返回int的型別,如下程式碼:

struct Program{staticintMain(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專屬獨加的功能,只不過個人最近才發現,而之前較少為人提及罷了。

往期精彩回顧