C#9.0新特性详解系列之四:顶级程序语句(Top-Level Programs)

1 背景与动机

一般,若是只想用C#在控制台上打印一行“Hello World!”,这可不是Console.WriteLine("Hello World!");一条语句就能够搞定的,还涉及到其余必要基础代码(如定义类和入口函数Main),例以下面:编程

using System;
class Program
{
    static void Main()
    {
        Console.WriteLine("Hello World!");
    }
}

就打印一句“Hello World!”,就这么多代码。这个不只对于初学者来讲麻烦,并且使得代码凌乱,而且增长了缩进层级。为了解决这些问题,就提出了顶级代码语句这个新特性。app

2 顶级语句

2.1 介绍

在C#9.0中,将Class的定义和主函数Main的声明省略掉,只写出你的核心业务代码,就成了顶级语句。上面这段代码,咱们能够用顶级语句写为:异步

using System;

Console.WriteLine("Hello World!");

这样,代码简洁清晰了不少,易于初学者理解。是否是有点写Python的感受?固然,任何语句都是容许的。若是你想返回值,你能够那样作;你想用await,也能够那样作;若是你想访问命令行参数,args也是可用的;你想使用本地函数,也是能够的。async

虽然可使用任何代码,可是有一些规则要求必须遵照:编程语言

  • 顶级语句必须放在using语句代码后面函数

  • 顶级语句必须用在任何类型或者命名空间声明的前面编码

  • 顶级语句只能写在一个源代码文件里,像现在只能写一个main方法同样。命令行

  • 顶级语句中定义的本地函数和变量,在顶级代码段外部的任何地方调用他们都会产生错误。code

下面这段代码就是一个比较好的示例:对象

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代码确认这一点:
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#的语言的原有的语法结构,任何语句均可以使用,没有产生额外的限制,从这些方面来讲,是一个值得确定的变化。

如对您有价值,请推荐,您的鼓励是我继续的动力,在此万分感谢。关注本人公众号“码客风云”,享第一时间阅读最新文章。

码客风云
相关文章
相关标签/搜索