<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# 10 新特性:Lambda 優(yōu)化

          共 2422字,需瀏覽 5分鐘

           ·

          2021-12-04 19:14

          Intro


          C# 10 對于 Lambda 做了很多的優(yōu)化,我們可以在 C# 中更加方便地使用委托和 Lambda 了,下面就來看一些示例


          Lambda Enhancements


          Natural types for lambdas


          C# 10 可以更好做類型推斷,很多時候編譯器可以自動推斷類型,我們可以不用再顯式聲明委托類型了來看一個簡單的示例:

          //?Func?func?=?()?=>?1;
          var?func?=?()?=>?1;
          //?Func?func2?=?()=>"Hello";
          var?func2?=?()?=>?"Hello";

          在之前的版本中我們是需要顯式聲明委托類型,如上述被注釋的代碼,在 C# 10 就可以直接使用 var 來聲明由編譯器去推斷委托的類型有些方法可能會有重載,支持不同的參數(shù)類型,編譯不能直接推斷出委托類型,我們可以指定輸入?yún)?shù)類型,示例如下:

          //?Func?parse?=?(string?s)?=>?int.Parse(s);
          var?parse?=?(string?s)?=>?int.Parse(s);

          Lambda Ref/Out/In Parameter Modifier

          我們可以在指定輸入?yún)?shù)類型的時候,可以設(shè)置 ref/out/int 來表示一個值類型的引用傳遞,示例如下:

          var?refFunc?=?(ref?int?x)?=>?{?x++;?};
          var?outFunc?=?(out?int?x)?=>?{?x?=?-1;?};
          var?inFunc?=?(in?int?x)?=>?{?};

          var?num?=?1;
          refFunc(ref?num);
          Console.WriteLine(num);

          outFunc(out?num);
          Console.WriteLine(num);

          輸出結(jié)果分別是 2-1

          Lambda Return Type

          C# 10 的委托可以指定返回類型,這樣我們在返回委托的時候可能就會比較方便了,比如下面的示例:

          //?return?type
          var?lambdaWithReturnValue0?=?int??()?=>?null;
          //?return?type?and?input?type
          var?lambdaWithReturnValue1?=?int??(string?s)
          ????=>?string.IsNullOrEmpty(s)???1?:?null;
          //?Func
          var?choose?=?object?(bool?b)?=>?b???1?:?"two";

          這樣就不需要顯式聲明委托類型了,在上面的基礎(chǔ)上做了進(jìn)一步的幫助編譯器做推斷

          Natual types for method

          對于能夠推斷出類型的方法,我們也可以使用 var 來聲明委托,示例如下:

          //?Action?func3?=?LocalMethod;
          var?func3?=?LocalMethod;
          void?LocalMethod(string?a)
          {
          ????Console.WriteLine(a);
          }

          var?checkFunc?=?string.IsNullOrEmpty;
          var?read?=?Console.Read;

          Action<string>?write?=?Console.Write;

          對于不能推斷類型的則需要顯式聲明類型委托類型,如上面最后一個委托 Console.Write 的參數(shù)會有多個重載,不能準(zhǔn)確推斷類型,所以需要聲明委托類型

          Lambda Attribute

          現(xiàn)在我們可以在 Lambda 表達(dá)式中指定 Attribute

          var?parse3?=[Description("Lambda?attribute")](string?s)?=>?int.Parse(s);
          var?choose3?=[Description("Lambda?attribute1")]object?(bool?b)?=>?b???1?:?"two";app.MapPost("/todo",?[Authorize]()=>?"Success");app.MapPost("/todo",?[Authorize]()=>?"Success");

          這在 ASP.NET Core Minimal API 中也有應(yīng)用,如:

          app.MapPost("/todo",?[Authorize]()=>?"Success");

          使用 ILSpy 查看低版本 C# 代碼,生成代碼如下:

          [Description("Lambda?attribute")]
          internal?int?
          b__4_0(string?s)
          {
          ????return?int.Parse(s);
          }

          [Description("Lambda?attribute1")]
          internal?object?
          b__4_1(bool?b)
          {
          ????return?b???((object)1)?:?"two";
          }

          More

          這些 Lambda 的優(yōu)化可以讓我們更加方便地使用 lambda,在 ASP.NET Core 中也有著很多的應(yīng)用

          app.Map("/",?()?=>?"Hello?world");app.MapPost("/auth",?[Authorize]()=>?"Authorize?needed");

          在聲明 Lambda 的時候可以自動轉(zhuǎn)成 Expression,我們也可以結(jié)合上面的新特性來聲明,示例如下:

          Expressionstring,?int>>?expr?=?(string?s)?=>?int.Parse(s);
          LambdaExpression?parseExpr?=?object?(bool?b)?=>?b???1?:?"two";
          Expression?parseExpr1?=?int??()?=>?null;

          4e340c884fefaacc202d36b9c9f98753.webp63ef7f4e8fa7adfd9edc0efad7236f2c.webp

          瀏覽 52
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報
          <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>
                  天堂av影视 | 91另类视频 | 人人操人人爱超碰 | 麻豆成人精品av 麻豆精品无码视频 | 操逼免费的视频 |