<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          C# 11 都有哪些新特性?

          共 2858字,需瀏覽 6分鐘

           ·

          2022-03-03 23:01

          前言

          .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á)式”中換行

          (interpolated strings)是 C# 6.0 引入的語(yǔ)法,它**允許在字符串中插入表達(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。

          C# 11 預(yù)覽:列表模式

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

          列表模式的語(yǔ)法是用方括號(hào)括起來的值,切片模式的語(yǔ)法是兩個(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è)可訪問的 LengthCount 屬性,以及一個(gè)帶 intSystem.Index 形參的索引器。
          • 切片模式適用于任何可計(jì)數(shù)和可切片的類型 —— 這意味著它有一個(gè)以 Range 為實(shí)參的可訪問索引器,或者具有兩個(gè) int 形參的可訪問 Slice 方法。
          • 目前正在考慮在 IEnumerable 類型上添加對(duì)列表模式的支持,點(diǎn)此查看關(guān)于該列表模式的詳細(xì)介紹。

          C# 11 預(yù)覽:新的參數(shù)空值檢查

          C# 11 提供了一種簡(jiǎn)化的語(yǔ)法,用于驗(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ù)空值檢查,可在此查看詳細(xì)介紹。

          如何嘗試預(yù)覽特性

          若要嘗試 C# 11的預(yù)覽特性,請(qǐng)創(chuàng)建一個(gè) C# 項(xiàng)目,并將 ?LangVersion 設(shè)置為 preview,.csproj 文件配置如下:

          "Microsoft.NET.Sdk">
          ????
          ????????Exe
          ????????net6.0
          ????????enable
          ????????enable
          ????????preview
          ????


          有關(guān) C# 11 的更多詳細(xì)內(nèi)容,請(qǐng)查看博客原文,或通過 GitHub 上的 CSharpLang 存儲(chǔ)庫(kù)進(jìn)行討論。

          轉(zhuǎn)自:oschina.net

          鏈接:oschina.net/news/184145/csharp-11-news-features

          瀏覽 46
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美日韩视频在线播放 | 欧美在线成人免费 | 国产视频xxxxxx | 亚洲黄视频在线播放网址 | 青青国产操逼视频 |