C#9.0新特性详解——顶级程序语句(Top-Level Programs)
- 作者: 酱油爆鱼
- 来源: 51数据库
- 2021-08-31
1 背景与动机
通常,如果只想用c#在控制台上打印一行“hello world!”,这可不是console.writeline("hello world!");一条语句就可以搞定的,还涉及到其他必要基础代码(如定义类和入口函数main),例如下面:
就打印一句“hello world!”,就这么多代码。这个不仅对于初学者来说麻烦,而且使得代码凌乱,并且增加了缩进层级。为了解决这些问题,就提出了顶级代码语句这个新特性。
2 顶级语句
2.1 介绍
在c#9.0中,将class的定义和主函数main的声明省略掉,只写出你的核心业务代码,就成了顶级语句。上面这段代码,我们可以用顶级语句写为:
这样,代码简洁清晰了很多,易于初学者理解。是不是有点写python的感觉?当然,任何语句都是允许的。如果你想返回值,你可以那样做;你想用await,也可以那样做;如果你想访问命令行参数,args也是可用的;你想使用本地函数,也是可以的。
虽然可以使用任何代码,但是有一些规则要求必须遵守:
- 顶级语句必须放在using语句代码后面
- 顶级语句必须用在任何类型或者命名空间声明的前面
- 顶级语句只能写在一个源代码文件里,像如今只能写一个main方法一样。
- 顶级语句中定义的本地函数和变量,在顶级代码段外部的任何地方调用他们都会产生错误。
下面这段代码就是一个比较好的示例:
2.2 原理
我们知道,c#作为面向对象的编程语言,一切类型都是面向对象的,要有类型和成员定义。顶级语句表面看着好像违反了这一规则,实际上没有。这是因为,顶级语句最终还是在编译的时候,被作为全局命空间中program类的main方法体中一段代码一起自动生成。如下所示:
需要注意的是,这里的类名program和方法名main只是用来举例,其实在编译器生成的不是这个名字。我们可以通过查看il代码确认这一点:

根据在顶级语句中是否有异步操作和返回值的情况,生成的入口函数签名也是不同的。具体如下面表格所示:
| 存在返回值 | 不存在返回值 | |
| 存在异步 | async static task<int> main(string[] args) | async static task main(string[] args) |
| 不存在异步 | static int main(string[] args) | static void main(string[] args) |
例如上面代码,生成的入口函数<main>$就如下代码所示:
3 结束语
使用顶级语句能简化我们的编码工作,使代码看起来简洁清晰,对初学者也很友好,本质上也未改变c#的语言的原有的语法结构,任何语句都可以使用,没有产生额外的限制,从这些方面来说,是一个值得肯定的变化。
以上就是c#9.0新特性详解——顶级程序语句(top-level programs)的详细内容,更多关于c# 9.0新特性的资料请关注其它相关文章!
- C#通过fleck实现wss协议的WebSocket多人Web实时聊天(附源码)
- 团队城市未满足要求:MSBuildTools12.0_x86_Path 存在
- 使用 MSBuild.exe 在发布模式下构建 C# 解决方案
- 当我发布 Web 应用程序时,AfterPublish 脚本不运行
- 构建时 T4 转换的产品仅在下一个构建中使用
- ASP.NET Core Application (.NET Framework) for Windows x64 only error in project.assets.json
- 新的 .csproj 格式 - 如何将整个目录指定为“链接文件"到子目录?
- 如何将条件编译符号(DefineConstants)传递给 msbuild
- MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板
- NuGet 包还原找不到包,没有源
