C# 10 完整特性介绍前言C#使其拥有强如 Haskell 、Rust 的表达能力不仅能提供从头到尾的跨程序集的静态类型支持还能做到像动态类型语言那样的灵活。逻辑代码是类型的证明只有类型系统强大了代码编写起来才能更顺畅、更不容易出错。1、record struct首先自然是 record struct解决了 record 只能给 class 而不能给 struct 用的问题1recordstructPoint(intX,intY);用 record 定义 struct 的好处其实有很多例如你无需重写GetHashCode和Equals之类的方法了。2、sealed record ToString 方法之前 record 的 ToString 是不能修饰为sealed的因此如果你继承了一个 record相应的 ToString 行为也会被改变因此这是个虚方法。但是现在你可以把 record 里的 ToString 方法标记成sealed这样你的ToString方法就不会被重写了。3、struct 无参构造函数一直以来 struct 不支持无参构造函数现在支持了12345structFoo{publicintX;publicFoo() { X 1; }}但是使用的时候就要注意了因为无参构造函数的存在使得new struct()和default(struct)的语义不一样了例如new Foo().X default(Foo).X在上面这个例子中将会得出false。4、匿名对象的 with可以用 with 来根据已有的匿名对象创建新的匿名对象了12var x new{ A 1, B 2 };var y x with { A 3 };这里 y.A 将会是 3 。5、全局的 using利用全局 using 可以给整个项目启用 usings不再需要每个文件都写一份。比如你可以创建一个 Import.cs然后里面写12usingSystem;usingi32 System.Int32;然后你整个项目都无需再 using System并且可以用 i32 了。6、文件范围的 namespace这个比较简单以前写 namespace 还得带一层大括号以后如果一个文件里只有一个 namespace 的话那直接在最上面这样写就行了1namespaceMyNamespace;7、常量字符串插值你可以给 const string 使用字符串插值了非常方便12conststringx hello;conststringy ${x}, world!;8、lambda 改进这个改进可以说是非常大我分多点介绍。8.1. 支持 attributeslambda 可以带 attribute 了123f [Foo] (x) x;// 给 lambda 设置f [return: Foo] (x) x;// 给 lambda 返回值设置f ([Foo] x) x;// 给 lambda 参数设置8.2. 支持指定返回值类型此前 C# 的 lambda 返回值类型靠推导C# 10 开始允许在参数列表最前面显示指定 lambda 类型了1f int() 4;8.3. 支持 ref 、in 、out 等修饰1f refint(refintx) refx;// 返回一个参数的引用8.4. 头等函数函数可以隐式转换到 delegate于是函数上升至头等函数123voidFoo() { Console.WriteLine(hello); }var x Foo;x();// hello8.5. 自然委托类型lambda 现在会自动创建自然委托类型于是不再需要写出类型了。123var f () 1;// Funcintvar g string (intx, string y) ${y}{x};// Funcint, string, stringvar h test.GetHashCode;// Funcint9、CallerArgumentExpression现在CallerArgumentExpression这个 attribute 终于有用了。借助这个attribute编译器会自动填充调用参数的表达式字符串例如1234voidFoo(intvalue, [CallerArgumentExpression(value)]string? expression null){Console.WriteLine(expression value);}当你调用Foo(4 5)时会输出4 5 9。这对测试框架极其有用因为你可以输出 assert 的原表达式了1234staticvoidAssert(boolvalue, [CallerArgumentExpression(value)]string? expr null){if(!value)thrownewAssertFailureException(expr);}10、tuple 支持混合定义和使用比如12inty 0;(var x, y, var z) (1, 2, 3);于是 y 就变成 2 了同时还创建了两个变量 x 和 z分别是 1 和 3 。11、接口支持抽象静态方法这个特性将会在 .NET 6 作为 preview 特性放出意味着默认是不启用的需要设置 LangVersionpreview/LangVersion 和 EnablePreviewFeaturestrue/EnablePreviewFeatures然后引入一个官方的 nuget 包 System.Runtime.Experimental 来启用。