C# 11 都有哪些新特性?
前言
.NET 首席項目經(jīng)理凱瑟琳在博客中介紹了 C# 11 的一些預覽性新功能,這些功能可以在 Visual Studio 17.1 和 .NET SDK 6.0.200 中體驗,下面摘錄一部分新特性作介紹:
C# 11 預覽:允許在內(nèi)插字符串的“插值表達式”中換行

(interpolated strings)是 C# 6.0 引入的語法,它**允許在字符串中插入表達式。**C# 的內(nèi)插字符串分為非逐字和逐字內(nèi)插字符串(分別是 $"" 和 $@"")兩種。兩者最大的區(qū)別是:非逐字內(nèi)插字符串與普通字符串一樣,不能在字符串文本中包含換行符,必須使用轉(zhuǎn)義符(如\r、\n)。相反,逐字插值字符串可以在其文本段中包含換行符,并且不會轉(zhuǎn)義換行符或其他字符。
但是,非逐字插值字符串中的“換行符限制”,從字符串文本擴散到了文本之外的 插值表達式 ,這導致了很多不必要的限制。比如在 C# 11 之前,下面這段代碼編譯起來會報錯:
var?v?=?$"Count?is\t:?{?this.Is.A.Really()
????????????????????????????.That.I.Should(
????????????????????????????????be?+?able)[
????????????????????????????????????to.Wrap()]?}.";
但在 C# 11 預覽版中,它是合法的,可以正常編譯。
關于該新特性的詳細討論可查看 GitHub Issue #4935。
C# 11 預覽:列表模式

新的 列表模式 允許將數(shù)組或列表與一系列模式匹配,例如 array is [1, 2, 3] 將匹配長度為 3 的整數(shù)數(shù)組,其元素分別為 1、2、3。除了允許匹配列表和數(shù)組,還可以匹配元素,且可以選擇包含零個或多個元素的*切片模式。*使用切片模式可以丟棄或捕獲零個或多個元素。
列表模式的語法是用方括號括起來的值,切片模式的語法是兩個點 **..**。切片模式后面可以跟著另一個列表模式,比如 var 模式來捕獲切片內(nèi)容。
比如,該模式匹配以下所有內(nèi)容:[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
????};
當它傳遞以下數(shù)組時,結(jié)果如下所示:
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
還可以捕獲切片模式的結(jié)果:
public?static?string?CaptureSlice(int[]?values)
????=>?values?switch
????{
????????[1,?..?var?middle,?_]?=>?$"Middle?{String.Join(",?",?middle)}",
????????[..?var?all]?=>?$"All?{String.Join(",?",?all)}"
????};
列表模式適用于任何可計數(shù)和可索引的類型 —— 這意味著它有一個可訪問的 Length或Count屬性,以及一個帶int或System.Index形參的索引器。切片模式適用于任何可計數(shù)和可切片的類型 —— 這意味著它有一個以 Range為實參的可訪問索引器,或者具有兩個int形參的可訪問Slice方法。目前正在考慮在 IEnumerable 類型上添加對列表模式的支持,點此查看關于該列表模式的詳細介紹。
C# 11 預覽:新的參數(shù)空值檢查

C# 11 提供了一種簡化的語法,用于驗證方法的參數(shù)不是 null ,以及正確拋出 ArgumentNullException。
以前可以使用樣板代碼的變體來驗證方法參數(shù)是否為空:
public?static?void?M(string?s)
{
????if?(s?is?null)
????{
????????throw?new?ArgumentNullException(nameof(s));
????}
????//?Body?of?the?method
}
使用新的參數(shù) null 檢查,可以通過添加 !! 到參數(shù)名,自動執(zhí)行空值檢查:
public?static?void?M(string?s!!)
{
????//?Body?of?the?method
}
自動生成的空值檢查代碼將在方法主體的代碼之前執(zhí)行。對于構(gòu)造器,該空值檢查發(fā)生在字段初始化、調(diào)用 base 構(gòu)造函數(shù)和調(diào)用 this 構(gòu)造函數(shù)之前。
有關該新的參數(shù)空值檢查,可在此查看詳細介紹。
如何嘗試預覽特性
若要嘗試 C# 11的預覽特性,請創(chuàng)建一個 C# 項目,并將 ?LangVersion 設置為 preview,.csproj 文件配置如下:
"Microsoft.NET.Sdk">
????
????????Exe
????????net6.0
????????enable
????????enable
????????preview
????
有關 C# 11 的更多詳細內(nèi)容,請查看博客原文,或通過 GitHub 上的 CSharpLang 存儲庫進行討論。
轉(zhuǎn)自:oschina.net
鏈接:oschina.net/news/184145/csharp-11-news-features
