C# 11 预览,又增加了实用的语法糖
文?| 羅奇奇
出品 | OSC開源社區(qū)(ID:oschina2013)
.NET 首席項(xiàng)目經(jīng)理凱瑟琳在博客中介紹了 C# 11 的一些預(yù)覽性新功能,這些功能可以在 Visual Studio 17.1 和 .NET SDK 6.0.200 中體驗(yàn),下面摘錄一部分新特性作介紹:
C# 11 預(yù)覽:允許在內(nèi)插字符串的“插值表達(dá)式”中換行
內(nèi)插字符串(interpolated strings)是 C# 6.0 引入的語法,它允許在字符串中插入表達(dá)式。C# 的內(nèi)插字符串分為非逐字和逐字內(nèi)插字符串(分別是?$""?和?$@"")兩種。兩者最大的區(qū)別是:非逐字內(nèi)插字符串與普通字符串一樣,不能在字符串文本中包含換行符,必須使用轉(zhuǎn)義符(如\r?、\n)。相反,逐字插值字符串可以在其文本段中包含換行符,并且不會(huì)轉(zhuǎn)義換行符或其他字符。
但是,非逐字插值字符串中的“換行符限制”,從字符串文本擴(kuò)散到了文本之外的?插值表達(dá)式?,這導(dǎo)致了很多不必要的限制。比如在 C# 11 之前,下面這段代碼編譯起來會(huì)報(bào)錯(cuò):
var v = $"Count is\t: { this.Is.A.Really().That.I.Should(be + able)[to.Wrap()] }.";但在 C# 11 預(yù)覽版中,它是合法的,可以正常編譯。
關(guān)于該新特性的詳細(xì)討論可查看?GitHub Issue #4935(https://github.com/dotnet/csharplang/issues/4935)。?
C# 11 預(yù)覽:列表模式
新的?列表模式?允許將數(shù)組或列表與一系列模式匹配,例如 array is [1, 2, 3] 將匹配長(zhǎng)度為 3 的整數(shù)數(shù)組,其元素分別為 1、2、3。除了允許匹配列表和數(shù)組,還可以匹配元素,且可以選擇包含零個(gè)或多個(gè)元素的切片模式。使用切片模式可以丟棄或捕獲零個(gè)或多個(gè)元素。
列表模式的語法是用方括號(hào)括起來的值,切片模式的語法是兩個(gè)點(diǎn)?..。切片模式后面可以跟著另一個(gè)列表模式,比如 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 };要探索列表模式,請(qǐng)參考:
public static int CheckSwitch(int[] values)=> values switch{[1, 2, .., 10] => 1,[1, 2] => 2,[1, _] => 3,[1, ..] => 4,[..] => 50};當(dāng)它傳遞以下數(shù)組時(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)}"};列表模式適用于任何可計(jì)數(shù)和可索引的類型 —— 這意味著它有一個(gè)可訪問的?Length?或?Count?屬性,以及一個(gè)帶?int?或?System.Index?形參的索引器。
切片模式適用于任何可計(jì)數(shù)和可切片的類型 —— 這意味著它有一個(gè)以?Range?為實(shí)參的可訪問索引器,或者具有兩個(gè)?int?形參的可訪問?Slice?方法。
目前正在考慮在 IEnumerable 類型上添加對(duì)列表模式的支持,點(diǎn)此查看(https://github.com/dotnet/csharplang/blob/main/proposals/list-patterns.md)關(guān)于該列表模式的詳細(xì)介紹。
C# 11 預(yù)覽:新的參數(shù)空值檢查
C# 11?提供了一種簡(jiǎn)化的語法,用于驗(yàn)證方法的參數(shù)不是?null?,以及正確拋出?ArgumentNullException。
以前可以使用樣板代碼的變體來驗(yàn)證方法參數(shù)是否為空:
public static void M(string s) {if (s is null){throw new ArgumentNullException(nameof(s));}// Body of the method }使用新的參數(shù) null 檢查,可以通過添加?!!?到參數(shù)名,自動(dòng)執(zhí)行空值檢查:
public static void M(string s!!) {// Body of the method }自動(dòng)生成的空值檢查代碼將在方法主體的代碼之前執(zhí)行。對(duì)于構(gòu)造器,該空值檢查發(fā)生在字段初始化、調(diào)用?base?構(gòu)造函數(shù)和調(diào)用?this?構(gòu)造函數(shù)之前。
有關(guān)該新的參數(shù)空值檢查,可在此查看(https://github.com/dotnet/csharplang/blob/main/proposals/param-nullchecking.md)詳細(xì)介紹。
如何嘗試預(yù)覽特性
若要嘗試 C# 11的預(yù)覽特性,請(qǐng)創(chuàng)建一個(gè) C# 項(xiàng)目,并將 ?LangVersion 設(shè)置為 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>有關(guān) C# 11 的更多詳細(xì)內(nèi)容,請(qǐng)查看博客原文,或通過 GitHub 上的?CSharpLang 存儲(chǔ)庫(https://github.com/dotnet/csharplang/discussions)進(jìn)行討論。
總結(jié)
以上是生活随笔為你收集整理的C# 11 预览,又增加了实用的语法糖的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET遗留应用改造——性能优化篇
- 下一篇: 完美:C# Blazor中显示Markd