zoukankan      html  css  js  c++  java
  • 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!”,就这么多代码。这个不仅对于初学者来说麻烦,而且使得代码凌乱,并且增加了缩进层级。为了解决这些问题,就提出了顶级代码语句这个新特性。

    2 顶级语句

    2.1 介绍

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

    using System;
    
    Console.WriteLine("Hello World!");
    

    这样,代码简洁清晰了很多,易于初学者理解。是不是有点写Python的感觉?当然,任何语句都是允许的。如果你想返回值,你可以那样做;你想用await,也可以那样做;如果你想访问命令行参数,args也是可用的;你想使用本地函数,也是可以的。

    虽然可以使用任何代码,但是有一些规则要求必须遵守:

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

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

    • 顶级语句只能写在一个源代码文件里,像如今只能写一个main方法一样。

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

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

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

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

    码客风云

    作者:MarkKang
    本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    用户自定义控件的嵌套问题
    ASP.NET进阶:调用Javascript
    [网络收集]FCKeditor配置和精简【附源码】
    检查session判断用户是否退出登录
    Server.Transfer VS Response.Redirect
    asp.net下ckeditor3.0.1和ckfinder_aspnet_1.4.1.1的配置方法
    Sudoku(数独)
    转自:蓝色污点的专栏
    LETTERS(字母)
    放苹果
  • 原文地址:https://www.cnblogs.com/markkang/p/14091908.html
Copyright © 2011-2022 走看看