伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 教育考试 » 文章详细 订阅RssFeed

C#9.0 终于来了,带你一起解读 nint 和 Pattern matching 两大新特性玩法

来源:本站原创 浏览:85次 时间:2022-12-13
一:背景1. 讲故事

上一篇跟大家聊到了Target-typed new 和 Lambda discard parameters,看博客园和公号里的阅读量都达到了新高,甚是欣慰,不管大家对新特性是多头还是空头,起码还是对它抱有一种极为关注的态度,所以我的这个系列还得跟,那就继续开撸吧,今天继续带来两个新特性,更多新特性列表,请大家关注:新特性预览

二:新特性研究1. Native ints

从字面上看貌似是什么原生类型ints,有点莫名其妙,还是看一看Issues上举得例子吧:


Summary: nint i = 1; and nuint i2 = 2;

Shipped in preview in 16.7p1.

有点意思,还是第一次看到有nint这么个东西,应该就是C#9新增的关键词,好奇心爆棚,快来实操一下。


  static void Main(string[] args)
  {
       nint i = 10;
       Console.WriteLine($"i={i}");
  }

从图中看,可以原样输出,然后用ILSpy查查底层IL代码,发现连IL代码都不用看。如下图:

从图中看原来 nint 就是 IntPtr 结构体哈,如果你玩过 C# 到 C++ 之间的互操作,我相信你会对Ptr再熟悉不过了,从这个 nint 上看,你不觉得C#团队对指针操作是前所未有的重视吗? 前有指针类型IntPtr,后有内存段处理集合Span,到现在直接提供关键词支持,就是尽最大努力让你在类型安全的前提下使用指针。

这就让我想起了前些天写的一篇互操作的文章,现在就可以用nint进行简化了,来段代码给大家看一下。

  • 原来的写法:


       [DllImport("ConsoleApplication1.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
       extern static IntPtr AddPerson(Person person);

       static void Main(string[] args)
       {
           var person = new Person() { username = "dotnetfly", password = "123456" };
           var ptr = AddPerson(person);
           var str = Marshal.PtrToStringAnsi(ptr);
       }
  • IntPtr -> nint 的写法

总的来说这个关键词不是最重要的,重要的是C#团队对指针操作抱有前所未有的重视,这是一个非常积极的信号。

2. Pattern matching improvements

模式匹配这个不算是什么新特性了,在本次C#9中也是继续得到了完善,可能有很多朋友对模式匹配不是很熟悉,毕竟是C#7才有的新玩法,后面几乎每一个新版本都在跟踪完善,我先科普一下吧。

❤ 模式匹配到底解决了什么问题

大家在编码的过程中,不可能遇不到 if/else 嵌套 if/else 的这种情况,有时候嵌套甚至达到5,6层之多,特别影响代码可读性,我就来YY个例子。

现在各个地方都在发不同面值的消费券,为了实现千人千面,消费券的发放规则如下:

性别年龄地区面值男<20安徽2000男<40上海4000男剩余剩余3000女<20安徽2500女<60安徽1500

如果用传统的方式,你肯定要用各种花哨的if/else来实现,如下代码:


       static decimal GetTicketFee(string sex, int age, string area)
       {
           if (sex == "男")
           {
               if (age < 20 && area == "安徽")
               {
                   return 2000;
               }
               else
               {
                   if (age < 40 && area == "上海")
                   {
                       return 4000;
                   }
                   else
                   {
                       return 3000;
                   }
               }
           }
           else
           {
               if (age < 20 && area == "安徽")
               {
                   return 2500;
               }
               if (age < 60 && area == "安徽")
               {
                   return 1500;
               }
           }

           return 0;
       }

这种代码可读性不是一般的差,就像大强子说的那样:看着都想打人。。。问题来了,这代码还有救吗???当然有了,这就需要用Pattern matching 去简化,毕竟它就是为了这种问题而生的,修改后的代码如下:


       static decimal GetTicketFee_Pattern(string sex, int age, string area)
       {
           return (sex, age, area) switch
           {
               ("男", < 20, "安徽") => 2000,
               ("男", < 40, "上海") => 4000,
               ("男", _, _) => 3000,
               ("女", < 20, "安徽") => 2500,
               ("女", < 60, "安徽") => 1500,
               _ => 0
           };
       }

看到这种化简后的代码是不是非常惊讶,这就是 Pattern matching 要帮你解决的场景,接下来看看底层的IL代码是什么样子。

从图中看,这反编译后的代码比我手工写的还要烂,无力吐槽哈,当然 模式匹配 有各种千奇百怪的玩法,绝对让你瞠目结舌,更多玩法可参考官方文档:模式匹配

这个特性最重要的是你一定要明白它的客户群在哪里?

三:总结

总的来说,这两个特性都是比较实用的,尤其是 Pattern matching 化解了你多少不得不这么写的烂代码,头发护理就靠它了,快来给它点个赞吧!

好了,先就这样吧,感谢您的阅读,希望本篇对你有帮助,谢谢。


  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net