首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >.Net 7的带参和不带参的Main入口

.Net 7的带参和不带参的Main入口

作者头像
江湖评谈
发布2023-02-12 15:20:46
发布2023-02-12 15:20:46
76800
代码可运行
举报
文章被收录于专栏:天下风云天下风云
运行总次数:0
代码可运行

前言: 来看看不同托管Main情况。

概述 一般的VS生成的默认Main如下:

代码语言:javascript
代码运行次数:0
运行
复制
static void Main(string[] args)
{
   Console.Write("Tian xia feng yun chu wo bei");
   Console.ReadLine();
}

可以看到Main函数带了参数string[] args。

其实它这个参数是可以去掉的,写成如下也可以

代码语言:javascript
代码运行次数:0
运行
复制
static void Main()
{
   Console.Write("Tian xia feng yun chu wo bei");
   Console.ReadLine();
}

为什么不要参数也是可以的呢? 本质是在CLR为托管入口提供了两套类型

代码语言:javascript
代码运行次数:0
运行
复制
enum CorEntryPointType
{
    EntryManagedMain // void main(String[])
    EntryCrtMain     // unsigned main(void)
};

EntryManagedMain是默认的,EntryCrtMain则是隐藏的一种托管入口类型。 CLR会判断当前的托管Main是否包含了参数,如果有且参数个数为1,则是默认的那种,如果无,则是第二种。所以导致了Main入口函数的参数可有可无。

代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
if (nParamCount == 0)
    *pType = EntryCrtMain;
else {
        *pType = EntryManagedMain;
        if (nParamCount != 1)
            ThrowMainMethodException(pFD, IDS_EE_TO_MANY_ARGUMENTS_IN_MAIN);

如果参数个数不等于1的话,抛出ThrowMainMethodException异常。可以在VS里面搞两个参数试验下。

结果报错如下

代码语言:javascript
代码运行次数:0
运行
复制
严重性代码说明项目文件行禁止显示状态
错误CS5001程序不包含适合于入口点的静态 "Main" 方法CSC	1活动

结尾: 作者:江湖评谈

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

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

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

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

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