<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 都有哪些新特性?

          共 2759字,需瀏覽 6分鐘

           ·

          2022-04-18 23:07

          前言

          .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ù)和可索引的類型 —— 這意味著它有一個可訪問的 LengthCount 屬性,以及一個帶 intSystem.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

          瀏覽 24
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  学生妹一级a片免费看 | 丝袜脚交一区二区三区 | 久久久福利 | 天堂8视频在线 | 少妇无套内谢太紧了一区 |