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代碼確認這一點:
根據在頂級陳述句中是否有異步操作和回傳值的情況,生成的入口函式簽名也是不同的,具體如下面表格所示:
| 存在回傳值 | 不存在回傳值 | |
|---|---|---|
| 存在異步 | 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#的語言的原有的語法結構,任何陳述句都可以使用,沒有產生額外的限制,從這些方面來說,是一個值得肯定的變化,
如對您有價值,請推薦,您的鼓勵是我繼續的動力,在此萬分感謝,關注本人公眾號“碼客風云”,享第一時間閱讀最新文章,
<iframe style="background: rgba(255, 255, 255, 1)" src="https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&album_id=1612459507345899521&__biz=MzAwNjcyNTU2Ng==#wechat_redirect" frameborder="0" width="100%" height="342"></iframe>
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/230866.html
標籤:.NET技术
上一篇:C#(五)基礎篇—字串
