最近是微软开了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是我认为另外一个败笔。对于自定义类型的解构,完全没有任何必要重新定义一个Deconstruct方法,模仿Typescript(Anders大神手笔)即可。如果要解构一个经过运算的东西,就应该重新定义另一个方法返回出来。解构解构,就是将原本值拿出来,而非一个不知道怎么运算出来东西。

var { name: x, age: y } = new { name: "xx", age: 26 }

对了,还有这次模式匹配中加入了and和or运算符,最迷惑的是,if语句中不能用and和or,只能用&&和||。我只能说,闲的蛋疼,又不是Python,加来干什么。

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

一个茴字有三种写法——吐槽C#9.0的Records的更多相关文章

  1. 【转载】在Linux下,一个文件也有三种时间,分别是:访问时间、修改时间、状态改动时间

    在windows下,一个文件有:创建时间.修改时间.访问时间.而在Linux下,一个文件也有三种时间,分别是:访问时间.修改时间.状态改动时间. 两者有此不同,在Linux下没有创建时间的概念,也就是 ...

  2. C语言:自定义一个查找字串的功能函数,类似于<string.h>中的strstr()

    //自定义一个字符串字串查找标准库函数strstr() #include<stdio.h> #include<string.h> char* myStrstr(char *st ...

  3. 一个匹配字字符串是aabbcc或者其他模式的运用

    <!--一个匹配字字符串是aabbcc或aaaabccc或者其他模式的运用--> function isPattern(str, pattern) { let str_a = str.sp ...

  4. EXCEL中,在其中列 前面or后面加一个“元”字的技巧

    EXCEL小技巧,我们平常需要用到一些,记录下,供有需要的人参考! 案例: EXCEL其中的一列,每个后面加一个“元”字,如果要1个1个去加,相当麻烦,其实很简单,只需要一个公式即可! 解决方法: ( ...

  5. js函数声明外面使用小括号括起来再接一个小括号的写法

    js函数声明外面使用小括号括起来再接一个小括号的写法 (function(){})(); (function(){}()); !function(){}(); 总结ps:意思将函数声明变成,直接执行的 ...

  6. 公司新来了一个质量工程师,说团队要保证 0 error,0 warning

    摘要:静态代码检查又称为静态程序分析,是指在不运行计算机程序的条件下,进行程序分析的方法. 本文分享自华为云社区<公司新来了一个质量工程师,说团队要保证 0 error,0 warning> ...

  7. 庆祝下,提交了第一个ceph pull request。实现了从0到1的突破

    庆祝一下!经过社区老司机的带路,昨天提交了第一个ceph pull request.实现了从0到1的突破,希望再接再厉提交更多代码到社区,为社区发展贡献一点自己力量. 提交的第一个被社区fix的bug ...

  8. 一个RtspServer的设计与实现和RTSP2.0简介

    一个RtspServer的设计与实现和RTSP2.0简介   前段时间着手实现了一个RTSP Server,能够正常实现多路RTSP流的直播播放,因项目需要,只做了对H.264和AAC编码的支持,但是 ...

  9. JavaScript语言里判断一个整数,属于哪个范围:大于0;小于0;等于0

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

随机推荐

  1. Python2 和 Python3的区别

    Python2 和 Python3的区别: 1.python2的默认编码方式是ascii码:python3的默认编码是utf-8. 如果出现乱码或者编码错误,可以使用以下编码在文件头来指定编码: #- ...

  2. 从蓝瘦“想哭”到 SELinux 看操作系统安全何在

    最近一周,来自网络的"想哭"勒索病毒(Wannacry Ransomware)在世界各地同时上演了一部绑匪大片,台词华丽,演技出色,当仁不让地新晋世界第一网红.全球各国除了默默忙于 ...

  3. (转)mysql数据库表名批量修改大小写

    由于不用服务器对mysql的表名的大小写敏感要求不一致,经常在出现线上的数据库down到了本地不能运行的情况,贴出一段代码用来批量修改数据库表名大小写. DELIMITER // DROP PROCE ...

  4. libevent(九)bufferevent

    bufferevent,带buffer的event struct bufferevent { struct event_base *ev_base; const struct bufferevent_ ...

  5. hdu1074之状压dp

    #include <iostream> #include <cstdio> #include <cstring> using namespace std; cons ...

  6. 2020年python开发微信小程序,公众号,手机购物商城APP

    2020年最新的技术全栈,手机短信注册登陆等运用, 精准定位用户 支付宝支付 以及前后端从0到大神的全部精解 2020年最新的技术全栈,手机短信注册登陆等运用, 精准定位用户 支付宝支付 以及前后端从 ...

  7. Day_11【集合】扩展案例5_对list集合对象中的元素进行反转,求最大值最小值,求元素i在list集合中首次出现的索引,将oldvalue替换为newvalue

    分析以下需求,并用代码实现 定义MyArrays工具类,该工具类中有以下方法,方法描述如下: 1.public static void reverse(ArrayList<Integer> ...

  8. FOC 转子初始位置检测(图文详解)

    本文介绍了PMSM的转子初始位置的各种情况: 文章目录 1 什么是转子的初始位置? 2 如何让转子运行到初始位置? 3 iq=IDC;id=0;θ=0i_{q}=I_{DC} ;i_{d}=0;\th ...

  9. 风扇转速通过FPGA采样

    1.风扇最大转速16000RPM,那么每一转需要时间60S/16000=0.00375S=375*10^4ns=T=T1+T2+T3+T4: 2.采样0.6S内的风扇detect信号的上升沿个数:0. ...

  10. [ACdream 1215 Get Out!]判断点在封闭图形内, SPFA判负环

    大致题意:在二维平面上,给一些圆形岛屿的坐标和半径,以及圆形船的位置和半径,问能否划到无穷远的地方去 思路:考虑任意两点,如果a和b之间船不能通过,则连一条边,则问题转化为判断点是否在多边形中.先进行 ...