微軟宣佈C# 8.0作爲 .NET Core 3.0版本的一部分正式可用,該消息同步發佈於.NET Conf 2019及其開發博客中。新的語言功能包括可爲空的引用類型、異步流、默認接口成員及新的代碼模式。Visual Studio 2019支持所有的新功能。
可爲空的引用類型是新版本中最重要的功能之一。它旨在通過使用特定語法規則來防止與空引用異常相關的場景,這個語法規則是:開發人員必須明確表示某個變量是否可以採用null值。在這種情況下,變量聲明中的類型名必須附加“?”(類似可爲空的值類型):
string? foo;
如果該變量的類型名後面沒有附加“?”,那麼,它被視爲一個不可爲空的引用類型。在這種情況下,編譯器將強制實行不可爲空的規則:該變量必須被初始化爲一個非空值,並且該變量永遠不能被賦予空值。可以(在大多數情況下不推薦)用變量名後面附加空寬容操作符“!”來覆蓋這個行爲:
foo!.Length;
還可以使用可爲空上下文來控制是否給出可空警告,或者可爲空的註解是否有影響。可以在項目級別或在帶有#nullable和 #pragmawarning 預處理指令的源代碼文件中指定可爲空上下文。另外,一個類型可以具備的可爲空行爲是如下四種之一:無視(Oblivious),不可爲空(nonnullable),可爲空(nullable),未知(unknown)。不同的可爲空類型會觸發不同的編譯行爲。可爲空引用類型的完整規範在這裏。
另一個重要功能是引入了異步流。該新功能的目的是引入對迭代器和異步方法的支持。此類方法可以用於需要消費或產生持續結果流(即來自物聯網設備或雲服務)的場景中。
異步流通過IAsyncEnumerable
下面的例子來自微軟的官方文檔。它實現了一個生成從0到19的序列的方法,生成每個數字之間的等待時間爲100毫秒:
public static async System.Collections.Generic.IAsyncEnumerable<int> GenerateSequence()
{
for (int i = 0; i < 20; i++)
{
await Task.Delay(100);
yield return i;
}
}
更多關於異步流的細節請參閱官方語言規範。
默認接口成員功能允許開發人員給接口添加成員,並提供這些成員的實現(從而允許接口中的方法有具體實現)。目的是爲API作者提供更多的靈活性,從而可以給現有接口添加方法而不會破壞與以前版本的兼容性。這個功能類似於Java的Default Methods。
C# 8.0還添加了兩個新的代碼模式:遞歸模式匹配和與using 語句相關的模式。簡而言之,遞歸模式允許模式包含其他模式,如下例所示(也來自於微軟的官方文檔):
IEnumerable<string> GetEnrollees()
{
foreach (var p in People)
{
if (p is Student { Graduated: false, Name: string name }) yield return name;
}
}
模式Student { Graduated: false, Name: string name }會檢查Person是否是Student,然後將常量模式false應用於其Graduated屬性來看看其是否仍然已註冊,並將模式string name應用於其Name屬性來獲得其名字(如果爲非空)。因此,如果p是Student,還沒有畢業並擁有一個非空名字,那麼,我們返回該名字。
using語句相關的新模式允許它被添加到局部變量聲明中。在這種情況下,局部變量using的壽命將延長到聲明它的範圍的末尾。如果有多個using局部變量,那麼將按照聲明它們的相反順序進行處理:
{
using var foo1 = new FileStream("...");
using var foo2 = new FileStream("...");
...
// Dispose foo2
// Dispose foo1
}
using 語句添加的另一個功能是disposable模式的概念,即可訪問Dispose實例方法的類型。遵循這個模式的類型可以參與using語句,而無需實現IDisposable:
class Bar
{
public void Dispose() { ... }
}
using (var foo = new Bar())
{
// statements
}
C# 8.0中添加的其他功能包括switch語句語法的更改和目標類型的新表達式的添加,這允許在已經給定類型的上下文中創建新對象時,省略類型聲明:
Vector2[] vectors = { new (1, 1), new (2, -1) };
所有新功能的摘要都在這裏,C#8.0的完整規範建議在這裏。另外,YouTube上(這裏和這裏)有 .NET Conf 2019上展示新特性的技術演講,該演講強調了新的語言功能。所有Visual Studio 2019 版本中都支持C# 8.0。
原文鏈接: