CandidateFeaturesForCSharp9
看到标题,是不是认为我把标题写错了?是的,C# 8.0还未正式发布,在官网它的最新版本还是Preview 5,通往C#9的漫长道路却已经开始.前写天收到了活跃在C#一线的 BASSAM ALUGILI
给我分享C# 9.0新特性,我在他文章的基础上进行翻译,希望能对大家有所帮助.
这是世界上第一篇关于C#9候选功能的文章。阅读完本文后,你将会为未来可能遇到的C# 9.0新特性做好更充分的准备。
这篇文章基于,
原生大小的数字类型
这次引入一组新类型(nint,nuint,nfloat等)'n'表示 native(原生)
,该特性允许声明一个32位或64位的数据类型,这取决于操作系统的平台类型。
nint nativeInt = 55; take 4 bytes when I compile in 32 Bit host. nint nativeInt = 55; take 8 bytes when I compile in 64 Bit host with x64 compilation settings.
xamarin中已存在类似的概念,
Records and Pattern-based With-Expression
这个功能我等待了很长时间,Records是一种轻量级的不可变类型,它可以是方法,属性,运算符等,它允许我们进行结构的比较, 此外,默认情况下,Records属性是只读的。
Records可以是值类型或引用类型。
Example
public class Point3D(double X, double Y, double Z); public class Demo { public void CreatePoint() { var p = new Point3D(1.0, 1.0, 1.0); } }
这些代码会被编译器转化如下形式.
public class Point3D { private readonly double <X>k__BackingField; private readonly double <Y>k__BackingField; private readonly double <Z>k__BackingField; public double X {get {return <X>k__BackingField;}} public double Y{get{return <Y>k__BackingField;}} public double Z{get{return <Z>k__BackingField;}} public Point3D(double X, double Y, double Z) { <X>k__BackingField = X; <Y>k__BackingField = Y; <Z>k__BackingField = Z; } public bool Equals(Point3D value) { retur