时间:2021-05-20
1 背景与动机
通常,如果只想用C#在控制台上打印一行“Hello World!”,这可不是Console.WriteLine("Hello World!");一条语句就可以搞定的,还涉及到其他必要基础代码(如定义类和入口函数Main),例如下面:
using System;class Program{ static void Main() { Console.WriteLine("Hello World!"); }}就打印一句“Hello World!”,就这么多代码。这个不仅对于初学者来说麻烦,而且使得代码凌乱,并且增加了缩进层级。为了解决这些问题,就提出了顶级代码语句这个新特性。
2 顶级语句
2.1 介绍
在C#9.0中,将Class的定义和主函数Main的声明省略掉,只写出你的核心业务代码,就成了顶级语句。上面这段代码,我们可以用顶级语句写为:
using System;Console.WriteLine("Hello World!");这样,代码简洁清晰了很多,易于初学者理解。是不是有点写Python的感觉?当然,任何语句都是允许的。如果你想返回值,你可以那样做;你想用await,也可以那样做;如果你想访问命令行参数,args也是可用的;你想使用本地函数,也是可以的。
虽然可以使用任何代码,但是有一些规则要求必须遵守:
下面这段代码就是一个比较好的示例:
using static System.Console;using System.Threading.Tasks;WriteLine("Hello,");Print(args[0]);await Task.Delay(1000);return 0;void Print(string arg){ WriteLine(arg);}2.2 原理
我们知道,C#作为面向对象的编程语言,一切类型都是面向对象的,要有类型和成员定义。顶级语句表面看着好像违反了这一规则,实际上没有。这是因为,顶级语句最终还是在编译的时候,被作为全局命空间中Program类的Main方法体中一段代码一起自动生成。如下所示:
static class Program{ static async Task Main(string[] args) { // 顶级语句 }}需要注意的是,这里的类名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>$就如下代码所示:
static class Program{ async static Task<int> Main(string[] args) { WriteLine("Hello"); Print(args[0]); await Task.Delay(1000); return 0; void Print(string arg) { WriteLine(arg); } }}3 结束语
使用顶级语句能简化我们的编码工作,使代码看起来简洁清晰,对初学者也很友好,本质上也未改变C#的语言的原有的语法结构,任何语句都可以使用,没有产生额外的限制,从这些方面来说,是一个值得肯定的变化。
以上就是C#9.0新特性详解——顶级程序语句(Top-Level Programs)的详细内容,更多关于C# 9.0新特性的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
域名层次一共分为三层,分别是顶层(TOP-LEVEL)、第二层(SECOND-LEVEL)、子域(SUB-DOMAIN)等。 域名(英语:DomainName
大家好,这是C#9.0新特性短系列的第5篇文章。弃元(Discards)是在C#7.0的时候开始支持的,它是一种人为丢弃不使用的临时虚拟变量。语法上它是用来赋值
域名层次一共分为三层,分别是顶层(TOP-LEVEL)、第二层(SECOND-LEVEL)、子域(SUB-DOMAIN)等。 域名(英语:DomainName
const的使用const必须修饰valconst只允许在top-level级别和object中声明,使用方式如下:constvalTHOUSAND=1000o
大家好,这是C#9.0新特性系列的第4篇文章。熟悉函数式编程的童鞋一定对“只读”这个词不陌生。为了保证代码块自身的“纯洁”,函数式编程是不能随便“弄脏”外来事物