首頁 > 軟體

C#11新特性預覽及使用介紹

2022-05-14 13:00:33

.NET 首席專案經理凱瑟琳在部落格中介紹了 C# 11 的一些預覽性新功能,這些功能可以在 Visual Studio 17.1 和 .NET SDK 6.0.200 中體驗,下面摘錄一部分新特性作介紹:

C# 11 預覽:允許在內插字串的“插值表示式”中換行

內插字串(interpolated strings)是 C# 6.0 引入的語法,它允許在字串中插入表示式。C# 的內插字串分為非逐字和逐字內插字串(分別是$""$@"")兩種。兩者最大的區別是:非逐字內插字串與普通字串一樣,不能在字串文字中包含換行符,必須使用跳脫符(如rn)。相反,逐字插值字串可以在其文欄位中包含換行符,並且不會跳脫換行符或其他字元。

但是,非逐字插值字串中的“換行符限制”,從字串文字擴散到了文字之外的插值表示式,這導致了很多不必要的限制。比如在 C# 11 之前,下面這段程式碼編譯起來會報錯:

var v = $"Count ist: { this.Is.A.Really ()
                            .That.I.Should (
                                be + able)[
                                    to.Wrap ()] }.";

但在 C# 11 預覽版中,它是合法的,可以正常編譯。

關於該新特性的詳細討論可檢視 GitHub Issue #4935。

C# 11 預覽:列表模式

新的列表模式允許將陣列或列表與一系列模式匹配,例如 array is [1, 2, 3] 將匹配長度為 3 的整數陣列,其元素分別為 1、2、3。除了允許匹配列表和陣列,還可以匹配元素,且可以選擇包含零個或多個元素的切片模式。使用切片模式可以丟棄或捕獲零個或多個元素。

列表模式的語法是用方括號括起來的值,切片模式的語法是兩個點..。切片模式後面可以跟著另一個列表模式,比如 var 模式來捕獲切片內容。

比如,該模式匹配以下所有內容:[1, 2, .., 10]

int[] arr1 = { 1, 2, 10 };
int[] arr1 = { 1, 2, 5, 10 };
int[] arr1 = { 1, 2, 5, 6, 7, 8, 9, 10 };

要探索列表模式,請參考:

public static int CheckSwitch (int[] values)
    => values switch
    {
        [1, 2, .., 10] => 1,
        [1, 2] => 2,
        [1, _] => 3,
        [1, ..] => 4,
        [..] => 50
    };

當它傳遞以下陣列時,結果如下所示:

WriteLine (CheckSwitch (new[] { 1, 2, 10 }));          // prints 1
WriteLine (CheckSwitch (new[] { 1, 2, 7, 3, 3, 10 })); // prints 1
WriteLine (CheckSwitch (new[] { 1, 2 }));              // prints 2
WriteLine (CheckSwitch (new[] { 1, 3 }));              // prints 3
WriteLine (CheckSwitch (new[] { 1, 3, 5 }));           // prints 4
WriteLine (CheckSwitch (new[] { 2, 5, 6, 7 }));        // prints 50

還可以捕獲切片模式的結果:

public static string CaptureSlice (int[] values)
    => values switch
    {
        [1, .. var middle, _] => $"Middle {String.Join (", ", middle)}",
        [.. var all] => $"All {String.Join (", ", all)}"
    };

列表模式適用於任何可計數和可索引的型別 —— 這意味著它有一個可存取的LengthCount屬性,以及一個帶intSystem.Index形參的索引器。

切片模式適用於任何可計數和可切片的型別 —— 這意味著它有一個以Range為實參的可存取索引器,或者具有兩個int形參的可存取Slice方法。

目前正在考慮在 IEnumerable 型別上新增對列表模式的支援,點此檢視關於該列表模式的詳細介紹。

C# 11 預覽:新的引數空值檢查

C# 11提供了一種簡化的語法,用於驗證方法的引數不是null,以及正確丟擲ArgumentNullException

以前可以使用樣板程式碼的變體來驗證方法引數是否為空:

public static void M (string s)
{
    if (s is null)
    {
        throw new ArgumentNullException (nameof (s));
    }
    // Body of the method
}

使用新的引數 null 檢查,可以通過新增!!到引數名,自動執行空值檢查:

public static void M (string s!!)
{
    // Body of the method
}

自動生成的空值檢查程式碼將在方法主體的程式碼之前執行。對於構造器,該空值檢查發生在欄位初始化、呼叫base建構函式和呼叫this建構函式之前。

有關該新的引數空值檢查,可在此檢視詳細介紹。

如何嘗試預覽特性

若要嘗試 C# 11 的預覽特性,請建立一個 C# 專案,並將 LangVersion 設定為 preview,.csproj檔案設定如下:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>net6.0</TargetFramework>
        <ImplicitUsings>enable</ImplicitUsings>
        <Nullable>enable</Nullable>
        <LangVersion>preview</LangVersion>
    </PropertyGroup>
</Project>

有關 C# 11 的更多詳細內容及新特性的資料請關注it145.com其它相關文章,或通過 GitHub 上的 CSharpLang 儲存庫進行討論!


IT145.com E-mail:sddin#qq.com