一:背景

1. 讲故事

.NET5 终于在 2020-08-25 也就是前天发布了第八个预览版,这么多的预览版搞得我都麻木了,接踵而来的就是更多的新特性加入到了 C# 9 中,既然还想呆在这条船上,得继续硬着头皮学习哈,这一篇跟大家聊聊新增的几个关键词。

二:新增关键词

1. init

出来一个新语法糖,首先要做的就是去揭它的老底,这样可以方便推测它的应用场景,为了方便表述,我先上一个例子:

public class Person{public string Name { get; init; }}

乍一看有点懵逼,没关系,先用 ILSpy 看一下,如下图:

上面这张图就已经很清晰的解释了,原来 init 就是自动生成了一个对 私有只读字段 的封装,对于 readonly 相信大家已经轻车熟路了,它的初始化只有两种方式:声明时和构造函数中,但从 C# 9 开始就多了一个属性赋值方式,也就是说现在有三种赋值方式了,还原代码如下:

public class Person{private readonly string name;public string Name{get => name;init{name = value;}}}

这种方式要是换作以前肯定是报错的,如下图:

有一点要注意的是编译器还做了一个特殊限制,准你在 类初始化器 中使用,不准你单独拿出来赋值,如下图所示:

所以总的来说, init 的作用就是多了一种让你初始化 只读字段 的方式,仅此而已罢了。

2. record

为了方便演示,我先上一段代码,如下所示:

public record Person{public string Name { get; set; }public int Age { get; set; }}

看起来挺 ???????? 的,现在除了 class,struct , enum, delegate,又来了一个 record,俺们的 C# 是越来越强大啦。

还是老规矩,用ILspy看看底层生成了个啥,如下代码所示:


public class Person : IEquatable<Person>
{protected virtual Type EqualityContract => typeof(Person);public string Name{get;set;}public int Age{get;set;}public virtual Person <>Clone(){return new Person(this);}public override int GetHashCode(){return (EqualityComparer<Type>.Default.GetHashCode(EqualityContract) * -1521134295 + EqualityComparer<string>.Default.GetHashCode(Name)) * -1521134295 + EqualityComparer<int>.Default.GetHashCode(Age);}public override bool Equals(object? obj){return Equals(obj as Person);}public virtual bool Equals(Person? P_0){return P_0 != null && (object)EqualityContract == P_0!.EqualityContract && EqualityComparer<string>.Default.Equals(Name, P_0!.Name) && EqualityComparer<int>.Default.Equals(Age, P_0!.Age);}protected Person(Person P_0){Name = P_0.Name;Age = P_0.Age;}public Person(){}bool IEquatable<Person>.Equals(Person other){return Equals(other);}
}

从 ILspy 生成出来的代码来看,可以发现两点信息:

  • record 玩的也是 class,重写了 object 中的一些方法 GetHashCode, Equals 等等。

  • 按类中的字段逐一比较判断类的相等性。

说到根据字段判断类的相等性,不知道大家可有似曾相识的感觉? ,反正让我想起了匿名类型,因为它生成的 C# 代码和 record 如出一辙,不信的话,我演示给你看呗。

var person = new { Name = "jack", Age = 20 };

接下来看一看是否真的是按照逐一字段比较,代码如下图:

static void Main(string[] args){var person = new Person() { Name = "jack", Age = 20 };var person2 = new Person() { Name = "jack", Age = 20 };var b = person.Equals(person2);}

看了这么多,我想你肯定有一些疑问:

1) 为啥要实现 IEquatable 接口

这是因为在当 Person 是 泛型 T 的时候避免走了默认的 public override bool Equals(object? obj),这是一个双装箱操作,性能太低效,深入研究可看我的博文:https://www.cnblogs.com/huangxincheng/p/12996361.html 。

2) 为啥有 equals 没有 ==

这个问题问得好,谁知道 C# 开发团队怎么想的,按照目前现状, 用 == 和 equals 比较两个对象,结果肯定是不一样的,我想你肯定能理解,毕竟一个是引用一个是按字段比较,这就比较坑爹了,如下图:

3) <>Clone() 方法有何作用

从方法体来看,这个方法用于做 浅copy 用的,但方法名前面有一对 <> ,说明是防你直接调用的,那问题来了,怎么调用呢?这就涉及一个新的语法糖。

3. with

这个语法糖也挺????????的,就是为了助你调用 record 的 <>clone 方法,不信的话,上代码呗。

static void Main(string[] args){var person = new Person() { Name = "jack", Age = 20 };var person2 = person with { };}

然后看一下 IL 反编译的代码

不过我也有一个疑问,为啥要防着我直接调用 Clone 方法呢?新东西,也不知道应用场景,谁搞的清楚哈~~~ ????????????

四:总结

总的来说C#是越来越新颖了,也一直在践行 jquery 的口号:write less,do more。有一点要提醒的是,语法糖多了,一定要知道其实它是个啥,不要常年混在编译器之上迷失了方向????????????

快醒醒,C# 9 中又来了一堆关键词 init,record,with相关推荐

  1. 兄弟们,快醒醒,我们的跑马灯不跑了。

    销售GG在工作群里:"弟兄们,快醒醒,咱现场的跑马灯不跑了." 还在加班的程序猿:"已经查过了,程序没Bug." 带娃玩的硬件攻城狮:"硬件没问题,这 ...

  2. 醒醒吧,月入3000的年轻人,你已经没救了

    "你一个月工资多少?" "3000--" "嗯,我也是3000,看来大家都差不多嘛." 年轻人,如果你还沉浸在周围的人都与你一样,每个月只赚 ...

  3. 在外包公司从 Java 后端干到安卓开发,你醒醒吧,阿里大师推荐的这份 Java 开发必读书单

    先是工作内容的问题. 当初他应聘的岗位是后端开发,可现实却是他既要写后端,也要写客户端.本着做的多做的广可以学到更多的原则,他并不是非常在意这个问题,边做边学,渐渐地也上了手. 其次是工作量的问题. ...

  4. 透过率和反射率的关系_全国本科率只有不到百分之五?!醒醒吧!

    近日,各行业平均工资的走势的一段视频火爆各大媒体,先来看一下这段视频 各行业年平均年薪https://www.zhihu.com/video/1263226462607867904 透过视频我们看到, ...

  5. 醒醒吧,这世界上根本没有稳定的工作

    原址 一个人成功地失业需要多久? 庞光的答案是:五年. 庞光是我的朋友,五年前,大学毕业后,他回到老家最大的国企工作. 每天朝九晚五,工资和福利固定,偶尔还有些灰色的收入,漂亮的妻子,可爱的孩子,一切 ...

  6. 内地移动支付全球领先?醒醒吧,香港在这5个方面已赶超内地了!

    只需一个手机号码或者Email地址就能实现快速转账?跨银行和跨支付平台秒到账?随便说一句"转账给女友1万元"就能实现转账还不收手续费?这就是香港新推出的转账神器"转数快& ...

  7. 上海麦当劳1张偷拍照流出,戳穿残酷事实:醒醒,哪来的铁饭碗

    在分享文章之前,照例先公布K哥今晚的直播主题: 1.硅谷爆火的web3.0究竟是啥? 2.今年有什么搞钱机会? 话题劲爆.干货多多,赶紧预约吧! 以下是正文: 01 最近,在上海的一家麦当劳里,1张很 ...

  8. 程序员:工作8年,存款100W,回老家买两套房子,网友:醒醒吧

    我们又再次回到老话题,程序员30-35岁之间是很容易被公司裁员的问题上,今天的主人公就是一位被裁的程序员老哥,工作8年存款100W,被裁之后面试3个月没有公司愿意要,决定转行,回到老家全款买了两套房子 ...

  9. 还在做搬运,拼凑,洗稿的自媒体作者醒醒吧!行业大地震已经来临

    还在做搬运,拼凑,洗稿的自媒体作者醒醒吧! 行业大地震已经来临,焦点访谈报道了自媒体行业中六大乱象: 一.色情低俗 二.标题党 三.谣言 四.黑公关 五.花钱买阅读量 六.伪原创 为什么自媒体这个行业 ...

最新文章

  1. 统计并输出某给定字符在给定字符串中出现的次数_查找常用字符
  2. springcloud注册demo(使⽤第⼀代Spring Cloud核⼼组件完成项⽬构建、编码及测试)
  3. mysql 主从热备份 5.6 参数_MySQL主从热备份
  4. 微信小程序全局分享设置
  5. 原生select下拉框样式修改:去除聚焦的黄色边框样式
  6. 如何克隆路由器MAC地址,怎么操作?
  7. iOS应用程序安全风险及漏洞解析
  8. 5G商用牌照发放 三家运营商发表获牌规划
  9. Pale Moon 15.1 发布,苍月浏览器
  10. 基于rdkit将smiles转换为smarts
  11. Unity 引擎 Managed Stripping Level 遇到的坑
  12. lpk劫持方式粘滞键后门后门T00ls Lpk Sethc v3.0 正式版下载
  13. 智课雅思词汇---二十七、形容词后缀-ant/-ent
  14. 计算机网络基础 试题 doc,计算机网络基础知识试题.doc
  15. 【矩阵论】4. 矩阵运算——广义逆——加号逆应用
  16. RemoteViews之RemoteViews的内部机制
  17. 有趣的数学问题-鸽巢原理
  18. docker内创建文件夹失败
  19. 一款简单好用的数字温度传感器芯片介绍
  20. 高级电子技能及生产工艺流水线实训台QY-GY01A

热门文章

  1. Flask 【第七篇】Flask中的wtforms使用
  2. object-c 入门基础篇
  3. 孤掌难鸣-------堵水眼
  4. PHP开发学习-Apache+PHP+MySQL环境搭建
  5. 关于使用 jquery Validate 使用出现的问题
  6. 使用Azure Serverless来开发Teams App
  7. 新手AS常见问题集锦
  8. lvs+keepalived详解
  9. python - work3
  10. 10.29 工作笔记 ndk编译C++,提示找不到头文件(ndk-build error: string: No such file or directory)...