C#9.0新特性詳解——頂級(jí)程序語句(Top-Level Programs)
1 背景與動(dòng)機(jī)
通常,如果只想用C#在控制臺(tái)上打印一行“Hello World!”,這可不是Console.WriteLine("Hello World!");一條語句就可以搞定的,還涉及到其他必要基礎(chǔ)代碼(如定義類和入口函數(shù)Main),例如下面:
using System; class Program { static void Main() { Console.WriteLine("Hello World!"); } }
就打印一句“Hello World!”,就這么多代碼。這個(gè)不僅對(duì)于初學(xué)者來說麻煩,而且使得代碼凌亂,并且增加了縮進(jìn)層級(jí)。為了解決這些問題,就提出了頂級(jí)代碼語句這個(gè)新特性。
2 頂級(jí)語句
2.1 介紹
在C#9.0中,將Class的定義和主函數(shù)Main的聲明省略掉,只寫出你的核心業(yè)務(wù)代碼,就成了頂級(jí)語句。上面這段代碼,我們可以用頂級(jí)語句寫為:
using System; Console.WriteLine("Hello World!");
這樣,代碼簡(jiǎn)潔清晰了很多,易于初學(xué)者理解。是不是有點(diǎn)寫Python的感覺?當(dāng)然,任何語句都是允許的。如果你想返回值,你可以那樣做;你想用await,也可以那樣做;如果你想訪問命令行參數(shù),args也是可用的;你想使用本地函數(shù),也是可以的。
雖然可以使用任何代碼,但是有一些規(guī)則要求必須遵守:
- 頂級(jí)語句必須放在using語句代碼后面
- 頂級(jí)語句必須用在任何類型或者命名空間聲明的前面
- 頂級(jí)語句只能寫在一個(gè)源代碼文件里,像如今只能寫一個(gè)main方法一樣。
- 頂級(jí)語句中定義的本地函數(shù)和變量,在頂級(jí)代碼段外部的任何地方調(diào)用他們都會(huì)產(chǎn)生錯(cuò)誤。
下面這段代碼就是一個(gè)比較好的示例:
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#作為面向?qū)ο蟮木幊陶Z言,一切類型都是面向?qū)ο蟮?,要有類型和成員定義。頂級(jí)語句表面看著好像違反了這一規(guī)則,實(shí)際上沒有。這是因?yàn)椋敿?jí)語句最終還是在編譯的時(shí)候,被作為全局命空間中Program類的Main方法體中一段代碼一起自動(dòng)生成。如下所示:
static class Program { static async Task Main(string[] args) { // 頂級(jí)語句 } }
需要注意的是,這里的類名Program和方法名Main只是用來舉例,其實(shí)在編譯器生成的不是這個(gè)名字。我們可以通過查看IL代碼確認(rèn)這一點(diǎn):
根據(jù)在頂級(jí)語句中是否有異步操作和返回值的情況,生成的入口函數(shù)簽名也是不同的。具體如下面表格所示:
存在返回值 | 不存在返回值 | |
存在異步 | async static Task<int> Main(string[] args) | async static Task Main(string[] args) |
不存在異步 | static int Main(string[] args) | static void Main(string[] args) |
例如上面代碼,生成的入口函數(shù)<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 結(jié)束語
使用頂級(jí)語句能簡(jiǎn)化我們的編碼工作,使代碼看起來簡(jiǎn)潔清晰,對(duì)初學(xué)者也很友好,本質(zhì)上也未改變C#的語言的原有的語法結(jié)構(gòu),任何語句都可以使用,沒有產(chǎn)生額外的限制,從這些方面來說,是一個(gè)值得肯定的變化。
以上就是C#9.0新特性詳解——頂級(jí)程序語句(Top-Level Programs)的詳細(xì)內(nèi)容,更多關(guān)于C# 9.0新特性的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#通過NPOI導(dǎo)入導(dǎo)出數(shù)據(jù)EXCEL
這篇文章主要為大家詳細(xì)介紹了C#通過NPOI導(dǎo)入導(dǎo)出數(shù)據(jù)EXCEL,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02DataGridView不顯示最下面的新行、判斷新增行、刪除行操作
這篇文章介紹了DataGridView不顯示最下面的新行、判斷新增行、刪除行的操作方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02C#?Winform文本面板帶滾動(dòng)條的實(shí)現(xiàn)過程
當(dāng)數(shù)據(jù)過多時(shí),往往無法在一頁中展示,所以非常需要一個(gè)滾動(dòng)條來調(diào)節(jié)頁面內(nèi)容,這篇文章主要給大家介紹了關(guān)于C#?Winform文本面板帶滾動(dòng)條的實(shí)現(xiàn)過程,需要的朋友可以參考下2022-12-12時(shí)間戳與時(shí)間相互轉(zhuǎn)換(php .net精確到毫秒)
本文給大家分享的時(shí)間戳與時(shí)間相互轉(zhuǎn)換(php .net精確到毫秒) ,感興趣的朋友一起學(xué)習(xí)吧2015-09-09C#語法糖(Csharp Syntactic sugar)大匯總
首先需要聲明的是“語法糖”這個(gè)詞絕非貶義詞,它可以給我?guī)矸奖?,是一種便捷的寫法,編譯器會(huì)幫我們做轉(zhuǎn)換;而且可以提高開發(fā)編碼的效率,在性能上也不會(huì)帶來損失。這讓java開發(fā)人員羨慕不已,呵呵。2010-06-06