一:背景

1. 讲故事

上一篇跟大家聊到了Target-typed newLambda 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 的写法

[DllImport("ConsoleApplication1.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
extern static nint AddPerson(Person person); static void Main(string[] args)
{
var person = new Person() { username = "dotnetfly", password = "123456" };
nint 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 化解了你多少不得不这么写的烂代码,头发护理就靠它了,快来给它点个赞吧!

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

C#9.0 终于来了,带你一起解读Pattern matching 和 nint 两大新特性玩法的更多相关文章

  1. C# 9.0 终于来了, Top-level programs 和 Partial Methods 两大新特性探究

    一:背景 1. 讲故事 .NET 5 终于在 6月25日 发布了第六个预览版,随之而来的是更多的新特性加入到了 C# 9 Preview 中,这个系列也可以继续往下写了,废话不多说,今天来看一下 To ...

  2. 有史来最大改变 Android 5.0十大新特性

    有史来最大改变 Android 5.0十大新特性 2014.10.16 14:51:31 来源:腾讯数码作者:腾讯数码 ( 0 条评论 )   距离Android系统上一次重大更新不到一年的时间,谷歌 ...

  3. Android 5.0(棒棒糖))十大新特性

    Android 5.0(棒棒糖))十大新特性 1. 全新Material Design设计风格 Android Lollipop全新的设计语言是受到了多种因素影响,是一种大胆的平面化创新.换句话说,谷 ...

  4. [Android 新特性] 有史来最大改变 Android 5.0十大新特性

    距离Android系统上一次重大更新不到一年的时间,谷歌再一次从KitKat升级到了Lollipop,而两次都使用糖果来命名,营销的目的显露无 遗.当我们首次看到Android 5.0 Lollipo ...

  5. Java 14 令人期待的 5 大新特性,打包工具终于要来了

    随着新的 Java 发布生命周期的到来,新版本预计将于 2020 年 3 月发布,本文将对其中的 5 个主要特性作些概述. Java 13刚刚发布给开发人员使用不久,最新版本的JDK于2019年9月发 ...

  6. jQuery 3.0最终版发布,十大新特性眼前一亮

    jQuery 3.0在日前发布了最终的全新版本.从2014年10月,jQuery团队对这个主要大版本进行维护开始,web开发者社区便一直在期待着这一刻的到来,终于在2016年6月他们迎来了这一个最终板 ...

  7. C#6.0中10大新特性的应用和总结

    微软发布C#6.0.VS2015等系列产品也有一段时间了,但是网上的教程却不多,这里真对C#6.0给大家做了一些示例,分享给大家.   微软于2015年7月21日发布了Visual Studio 20 ...

  8. MySQL 8.0的十大新特性

    今天,让我们看一下MySQL8.0提升数据库管理员工作效率的十大改进. 从一大堆特性你们找出十点并不太容易,以下是这十大特性: 1.临时表的改进 2.持续的全局变量 3.取消默认MyISAM系统表 4 ...

  9. FineUI(专业版)v2.6.0即将支持的两个新特性!

    特性1:以一挡三,将 160 行代码缩减为 60 行的技巧! 为了更新单元格的编辑值,我们需要下面三个函数同时上阵: GetModifiedDict:修改的单元格值 GetDeletedList:删除 ...

随机推荐

  1. win10安装nodejs,修改全局依赖位置和环境变量配置

    为什么要修改nodejs全局依赖位置? nodejs全局依赖安装默认位置在C盘,导致C盘文件太大,影响电脑运行速度. 步骤: 安装nodejs(在node官网下载并安装) 查看nodejs版本(在命令 ...

  2. npm run build 时 报 __webpack_public_path__ = window.webpackPublicPath; 中的windows未定义

    原本 webpack.js在webpack.config.babel.js同目录下,在app.jsx中引用,用mac打包没问题,但是window就报window未定义,改到src和app.jsx同目录 ...

  3. 王玉兰201771010128《面向对象与程序设计(Java)》第十一周学习总结

    一:理论知识部分: (1)集合:集合(Collection或称为容器)是一种包含多个元素并提供对所包含元素操作方法的类,其包含的元素可以由同一类型的对象组成,也可以由不同类型的对象组成. A:集合类的 ...

  4. poj 2296

    Map Labeler Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2047   Accepted: 682 Descri ...

  5. Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(一)

    好吧,这个题目我也想了很久,不知道如何用最简单的几个字来概括这篇文章,原本打算取名<Angular单页面应用基于Ocelot API网关与IdentityServer4+ASP.NET Iden ...

  6. Java——关键字instanceof

    instanceof 判断一个对象是否为一个类的实例,是为true ,否为false class Animal{} class Cat extends Animal{} /**instanceof 判 ...

  7. uni-app运行到浏览器跨域H5页面的跨域问题解决方案

    官方文档对跨域的解决方案推荐: https://ask.dcloud.net.cn/article/35267 更方便的解决方案 项目根目录直接创建一个vue.config.js文件,并在里面配置代理 ...

  8. Javascript输入输出语句

    方法 说明 归属 alert(msg) 浏览器弹出警示框 浏览器 console.log(msg) 浏览器控制台打印输出信息 浏览器 prompt(info) 浏览器弹出输入框,用户可以输入 浏览器 ...

  9. SpringBoot工程创建的三种方式

    一. 通过IDEA的spring Initializer创建 1. 打开创建项目面板 File->New->Project->Spring Initializr 2. 填写Maven ...

  10. 爱奇艺|B站|优酷|腾讯视频高清无水印视频下载方法(软件工具教程)

    导读:经常在大型视频网站平台上看到一些很价值和视频,希望能高清无水印下载到本地学习观看,今天小程序定制开发代码哥DaiMaGe6给大家分享一招免费下载全网高清无水印视频的方法. 高清无水印视频下载工具 ...