1. 讲故事安全
上一篇跟你们聊到了Target-typed new 和 Lambda discard parameters,看博客园和公号里的阅读量都达到了新高,甚是欣慰,无论你们对新特性是多头仍是空头,起码仍是对它抱有一种极为关注的态度,因此个人这个系列还得跟,那就继续开撸吧,今天继续带来两个新特性,更多新特性列表,请你们关注:新特性预览ide
1. Native intsui
从字面上看貌似是什么原生类型ints,有点莫名其妙,仍是看一看Issues上举得例子吧:编码
Summary: nint i = 1; and nuint i2 = 2; Shipped in preview in 16.7p1.
有点意思,仍是第一次看到有nint这么个东西,应该就是C#9新增的关键词,好奇心爆棚,快来实操一下。3d
static void Main(string[] args) { nint i = 10; Console.WriteLine($"i={i}"); }
从图中看,能够原样输出,而后用ILSpy查查底层IL代码,发现连IL代码都不用看。以下图:指针
从图中看原来 nint 就是 IntPtr 结构体哈,若是你玩过 C# 到 C++ 之间的互操做,我相信你会对Ptr再熟悉不过了,从这个 nint 上看,你不以为C#团队对指针操做是史无前例的重视吗? 前有指针类型IntPtr,后有内存段处理集合Span,到如今直接提供关键词支持,就是尽最大努力让你在类型安全的前提下使用指针。code
这就让我想起了前些天写的一篇互操做的文章,如今就能够用nint进行简化了,来段代码给你们看一下。blog
原来的写法:ip
[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); }
总的来讲这个关键词不是最重要的,重要的是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 化解了你多少不得不这么写的烂代码,头发护理就靠它了,快来给它点个赞吧!
好了,先就这样吧,感谢您的阅读,但愿本篇对你有帮助,谢谢。