最近是微软开了Build 2020大会,由于疫情原因,改成了在线举行,Build大会上,C#公布9.0版本。

我个人对于C#的更新向来都是喜闻乐见,乐于接受的,对于博客园上某些人天天嘲讽C#只会增加语法糖的人,我向来对他们不屑一顾,认为他们是井底之蛙。

因此我仔细看了微软发的文章Welcome to C# 9.0,准备好好观摩和学习。但当我看到Records语法时,我就隐隐感觉C#这样玩语法糖要翻车了。

后来看到知乎上的问题如何评价即将发布的 C# 9.0?,我稍加思索,愈发觉得Records语法完全是大型翻车现场,因此整理出来我认为的Records的翻车点(兼吐槽)。

首先看官方给出的Records样例

public data class Person
{public string FirstName { get; init; }public string LastName { get; init; }
}

第一个吐槽点:data class声明有必要吗?如果要多加一个data关键字,直接用record不好吗,如果不加关键字,为什么不用readonly class啊。

public record Person {}
public readonly class Person {}

第二个吐槽点,官方给出上面的等价定义

public data class Person { string FirstName; string LastName; }
看到这里我几乎晕了过去,确定这两者等价吗?语言的一致性破坏的损失殆尽?不信?如果把data这个词去掉的话。

public class Person
{public string FirstName { get; init; }public string LastName { get; init; }
}
public class Person
{string FirstName; string LastName;
}

但凡任何一个C#初学者,都不会说上面等价,因为那段定义等于

public class Person
{public string FirstName { get; init; }public string LastName { get; init; }
}
public class Person
{private string FirstName { get; set; }; private string LastName { get; set; };
}

这怎么等价?也就是说,加了data一个关键词,后面我们对C#语法的掌握就要被推翻?!

Ok,上面喷完了,我们再来看看官方还有第3种定义方法

public data class Person(string FirstName, string LastName);
这种record定义非常漂亮。但,一个record有3种定义方法?!你说之前的LINQ有2种写法,我认了,毕竟看起来更加简单直观,更像sql。但record是现代版的一个茴字有3种写法啊!

总结,这次Records语法,看起来漂亮,实际上是一场巨大的灾难。归根结底在于对于Records的定位不够清晰。如果要真正的Immutable,那么Records应该是类似Tuple的存在,应该和Class切割开,走类似Rust的Stuct的路子,加上UnionType,EnumClass就是起飞。如果想要一个看起来Immutable实际上是Mutable的Class的话,还不如想想怎么简化Class语法,但要注意简化的过程中要保持一致性。什么?你要Mutable?不就是Class嘛。

下面是一些碎碎念时间。

自从C#之父Anders去做Typescript之后,能看出C#团队还是尽心尽力改善C#的,比如模式匹配(一点一点加),可空引用类型,类型推导的new,Indies和Ranges,。

但不得不说,他们的品味偶尔也会下滑。

比如说前几天在博客园Rwing发过的的强制非空语法,给人一种画蛇添足的感觉,但考虑到历史包袱,可以理解。

Deconstruct是我认为另外一个败笔。对于vb.net教程自定义类型的解构,完全没有任何必要重新定义一个Deconstruct方法,模仿Typescript(Anders大神手笔)即可。如果要解构一个经过运算的东西,就应该重新定义另一个方法返回出来。解构解构,就是将原本值拿出来,而非一个不知道怎么运算出来东西。

var { name: x, age: y } = new { name: “xx”, age: 26 }
对了,还有这次模式匹配中加入了and和or运算符,最迷惑
c#教程的是,if语句中不能用and和or,只能用&&和||。我只能说,闲的蛋疼,又不是Python,加来干什么。

我吐槽完了,大家可以顶/踩我了。大家也可以去上面知乎问题发表意见,共同讨论C#语言。

一个茴字有三种写法——吐槽C#9.0的Records相关推荐

  1. 茴香豆的“茴”字有三种写法

    我要讲的这个"茴"字是什么呢?其实是excel的用户自定义函数(udf). excel从4.0开始提供了第一种添加udf的方式:XLL.这个本质上是一个DLL.但是只要这个DLL暴 ...

  2. HelloWorld! 程序猿同志,茴香豆的茴字有几种字法?

    挖煤的矿工,久处深矿,不见天日. 一新矿工某日第一次出井, 就要重见天日.正欲抬头睁眼之时, 守在井口的人对他大声吼到: "别睁大眼,慢点出来,千万别睁大眼, 小心太阳光,亮瞎你狗日的眼睛& ...

  3. python井字棋_用Python做一个井字棋小游戏

    井字棋是一个经典的小游戏,在九宫格上玩家轮流画OXO,当每列或每行或是两个对角成一线时便是获胜. 今天就用Python编写一个井字棋小游戏,与电脑对战. 程序执行画面如下图所示: 程序提供了两种人工智 ...

  4. 人生百味,浓缩到最后就是一个淡字

    1.人生百味.浓缩到最后就是一个淡字. 人缘,不是有多少人认识你,而是有多少人愿意帮助你.人脉,不是你利用过多少人.而是你帮助过多少人:人气.不是有多少人在你面前吹捧你,而是有多少人在你背后称赞你. ...

  5. python井字棋游戏人机对战_用Python做一个井字棋小游戏

    井字棋是一个经典的小游戏,在九宫格上玩家轮流画OXO,当每列或每行或是两个对角成一线时便是获胜. 今天就用Python编写一个井字棋小游戏,与电脑对战. 程序执行画面如下图所示: 程序提供了两种人工智 ...

  6. java 井字棋 人机_一个井字棋tictactoe游戏的java实现 | Soo Smart!

    这是一个井字棋游戏的java实现.摘录于stackoverflow. 游戏规则很简单,只要一方棋子在水平线,垂直线或者对角线任意一条线上排列成功即为获胜. 作者原先的代码存在着一些问题: 代码如下: ...

  7. 世间所有,逃不过一个“缘”字

    什么是缘? 释迦摩尼说: "这一生,无论你遇见谁,他都是你生命中该出现的人,绝非偶然." 张爱玲说: "于千万人之中遇见你所遇见的人,于千万年之中,时间的无涯的荒野里,没 ...

  8. PHP全站pjax影响收录,zblogPHP增加pjax功能,大写的一个“帅”字 - 胡言乱语

    哈哈,紧跟时代潮流,李洋博客增加最新最炫的pjax功能.大写加粗的一个"帅"字,呵呵! 很久没写博客文章了,最近移植博客主题,弄上隐了,哈哈.言归正传,说说新功能pjax: 什么是 ...

  9. 维度诅咒_让我们面对现实:“敏捷”是一个被诅咒的名字

    维度诅咒 Let's do a quick scientific experiment together. You are in an art gallery and a vase is sittin ...

  10. 删除表中的一个列名字段表出现如下情况

    删除一列的时候出现了: 删除表中的一个列名字段表出现如下情况: [IBM][CLI Driver][DB2/NT] SQL0443N  例程 "SYSPROC.ALTOBJ"(特定 ...

最新文章

  1. JAVA_OA管理系统(二):SpringMVC笔记基础篇01注入方法
  2. Acwing第 26 场周赛【完结】
  3. Linux系统上的程序调优思路概要
  4. STM32 Flash详解
  5. android 10 apk 存储适配,AndroidQ(10) 分区存储适配方法
  6. Qt中采用多线程实现Socket编程
  7. 如何吧本地仓库提交到github_如何将本地代码提交到github远程仓库(第一次,建立连接并且提交)...
  8. 函数声明和函数表达式的区别
  9. 澳门大学计算机qs排名,澳门大学世界QS排名
  10. Altera的单时钟同步FIFO,带empty和full端口
  11. P卡、worldfirst、连连跨境电商收款哪家好?
  12. 第39级台阶(递归+dp)
  13. js神秘的电报密码---哈弗曼编码
  14. java查看内存信息
  15. OSWatcher的安装使用
  16. bootstrap轮播速度_BootStrap:轮播插件
  17. HashMap 底层源码详解(jdk1.8)
  18. jdk17下载详细步骤
  19. 基层社会治理综合管理平台智慧街道Java商业源码
  20. 商务部公布跨国公司港澳台企业捐款详情

热门文章

  1. JavaScript分号使用指南
  2. 肯德尔系数怎么分析_论文实战2——德尔菲法与信度分析
  3. MATLAB机器人工具箱2-机器人模型建立
  4. 懵逼树上懵逼果:探索二分法搜索
  5. drupal8 自定义主题开发步骤
  6. minimum在java中的意思_Java Calendar getMinimum()方法与示例
  7. css让图片img水平居中-行内元素居中
  8. 百度地图、腾讯地图坐标转换
  9. mysql数据库维护(mysql学习笔记)
  10. windows 文件系统