C# 8.0正式發佈:Visual Studio 2019支持所有新功能

微軟宣佈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  和 IAsyncEnumerator 接口實現,這些接口可以與async/await功能(最初在C# 5.0中引進)結合使用。返回異步流的方法必須用async 修飾符聲明,還必須使用某個新接口作爲其返回類型。它還必須包含 yield return 語句來返回異步流中的後續元素。

下面的例子來自微軟的官方文檔。它實現了一個生成從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。

原文鏈接:

Microsoft Releases C# 8.0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章