1. C# 9.0 新特性預(yù)覽:頂級(jí)語(yǔ)句

        共 3397字,需瀏覽 7分鐘

         ·

        2020-10-15 17:58


        轉(zhuǎn)自:Rwing
        cnblogs.com/Rwing/p/csharp-9-0

        前言


        隨著 .NET 5 發(fā)布日期的日益臨近,其對(duì)應(yīng)的 C#新版本已確定為 C# 9.0,其中新增加的特性(或語(yǔ)法糖)也已基本鎖定,本系列文章將向大家展示它們。


        頂級(jí)語(yǔ)句 (Top-level statements)


        頂級(jí)語(yǔ)句這個(gè)名字看起來(lái)不是那么直觀,或許它的曾用名更好一些:Simple Programs,簡(jiǎn)單程序。


        目的


        想必大家都知道,即使是最簡(jiǎn)單的 C#程序,也會(huì)有一定量的繁文縟節(jié),因?yàn)樽钌僖残枰粋€(gè) Main 方法。這似乎妨礙了語(yǔ)言的學(xué)習(xí)和程序的清晰度。


        因此,這個(gè)特性的最主要目的就是為了初學(xué)者和代碼的清晰度,讓書(shū)寫(xiě) C# 程序可以變得更輕松。


        語(yǔ)法


        語(yǔ)法 Spec 如下,允許在命名空間的聲明前面,添加一組語(yǔ)句,且只允許有一個(gè)編譯單元(可以認(rèn)為是一個(gè)源文件)擁有這種語(yǔ)句:


        compilation_unit
        : extern_alias_directive* using_directive*
        global_attributes? statement* namespace_member_declaration* ;


        Spec 比較難懂,我們直接來(lái)看示例:簡(jiǎn)單來(lái)說(shuō),就是允許在源文件中直接書(shū)寫(xiě)代碼語(yǔ)句而不用寫(xiě) Main 方法:


        System.Console.WriteLine("Hi!");


        以上代碼會(huì)被翻譯為:


        static class $Program
        {
        static void $Main(string[] args)
        {
        System.Console.WriteLine("Hi!");
        }
        }


        可以看到,WriteLine語(yǔ)句被自動(dòng)的包在了一個(gè)類(lèi)和 Main 方法里面。

        自動(dòng)生成的 Main 方法的返回值也會(huì)根據(jù)是否異步以及是否有返回值來(lái)變化,例如:


        await System.Threading.Tasks.Task.Delay(1000);
        System.Console.WriteLine("Hi!");
        return 0;


        會(huì)被翻譯為:


        static class $Program
        {
        static async Task $Main(string[] args)
        {
        await System.Threading.Tasks.Task.Delay(1000);
        System.Console.WriteLine("Hi!");
        return 0;
        }
        }


        各種場(chǎng)景


        • 支持在 using 語(yǔ)句后面:


        using System;
        Console.Write("Hi!");


        會(huì)被翻譯為:


        using System;
        static class $Program
        {
        static void $Main(string[] args)
        {
        Console.Write("Hi!");
        }
        }


        • 也可以加上本地函數(shù):


        local();
        void local() => System.Console.WriteLine(2);


        可以與其它代碼共存,例如類(lèi)的聲明:


        Type.M();
        static class Type
        {
        public static void M()
        {
        System.Console.WriteLine("Hi!");
        }
        }


        稍微復(fù)雜一點(diǎn)的:


        await using (var x = new C())
        {
        System.Console.Write("body ");
        }
        class C : System.IAsyncDisposable, System.IDisposable
        {
        public System.Threading.Tasks.ValueTask DisposeAsync()
        {
        System.Console.Write("DisposeAsync");
        return new System.Threading.Tasks.ValueTask(System.Threading.Tasks.Task.CompletedTask);
        }
        public void Dispose()
        {
        System.Console.Write("IGNORED");
        }
        }


        • 同時(shí)兼容了using alias的語(yǔ)法


        using alias1 = Test;
        string Test() => ""1"";
        System.Console.WriteLine(Test());
        class Test {}
        delegate Test D(alias1 x);
        namespace N1
        {
        using alias2 = Test;
        delegate Test D(alias2 x);
        }


        • 也可以同時(shí)與顯示的 Main 方法聲明在一起,只不過(guò)顯示的Main方法會(huì)被忽略掉并提示一個(gè)警告


        using System;
        using System.Threading.Tasks;
        System.Console.Write("Hi!");
        class Program
        {
        static void Main() // warning CS7022: The entry point of the program is global code; ignoring 'Program.Main()' entry point
        {
        Console.Write("hello");
        }
        }


        限制


        • 不支持在多個(gè)編譯單元下?lián)碛许敿?jí)語(yǔ)句:


        // file1.cs
        System.Console.WriteLine("1");
        // error CS9001: Only one compilation unit can have top-level statements.

        // file2.cs
        System.Console.WriteLine("2");
        // error CS9001: Only one compilation unit can have top-level statements.


        • 不能放在類(lèi)的內(nèi)部


        class Test
        {
        System.Console.WriteLine("Hi!"); // ERROR
        }


        • 不能放在命名空間的內(nèi)部


        namespace Test
        {
        System.Console.WriteLine("Hi!"); // ERROR
        }


        • 要么所有分支都有返回值,要么都沒(méi)有


        System.Console.WriteLine();
        if (args.Length == 0)
        {
        return 10; // error CS0161: 不是所有代碼分支都有返回值
        }


        • 雖然可以可以與類(lèi)聲明一起寫(xiě),但是在類(lèi)中是無(wú)法調(diào)用到 Main 方法 args 入?yún)⒌模驗(yàn)榫幾g時(shí)會(huì)編譯為兩個(gè)類(lèi)


        System.Console.WriteLine(args);
        class Test
        {
        void M()
        {
        System.Console.WriteLine(args); // ERROR
        }
        }


        • 自然,你也不能用 args 來(lái)命名本地函數(shù)


        args(1);
        void args(int x) // ERROR
        {}







        回復(fù)?【關(guān)閉】學(xué)關(guān)
        回復(fù)?【實(shí)戰(zhàn)】獲取20套實(shí)戰(zhàn)源碼
        回復(fù)?【被刪】學(xué)個(gè)
        回復(fù)?【訪客】學(xué)
        回復(fù)?【小程序】學(xué)獲取15套【入門(mén)+實(shí)戰(zhàn)+賺錢(qián)】小程序源碼
        回復(fù)?【python】學(xué)微獲取全套0基礎(chǔ)Python知識(shí)手冊(cè)
        回復(fù)?【2019】獲取2019 .NET 開(kāi)發(fā)者峰會(huì)資料PPT
        回復(fù)?【加群】加入dotnet微信交流群

        強(qiáng)烈推薦:超全C#幫助類(lèi),提升效率就靠它


        百度網(wǎng)盤(pán)空間“縮水”了,趕緊做這件事,僅剩8天!



        瀏覽 118
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 2012天天夜夜 | 日韩欧美视频在线 | 亚洲精品AA | 国产婷婷色一区二区三区 | 国内精品视频 |