posted at 2024.3.6 14:07 by Administrator
2021年11月8日,微软正式发布了 C# 10, 主要新增了常见场景所需代码量最小化、Struct、Lambda 扩展、支持泛型的特性。具体介绍如下:
一、命名空间的全局和隐式使用
现有的using指令是写在.cs头部,指定引用的命名空间。C# 10 引入了一个新的Global using指令和Implicit using指令以减少在每个文件顶部指定的使用次数。
如果关键字global出现在using指令之前,则该 using 适用于整个项目:
global using System;
目前using指令的任何功能都可以照样使用。
隐式Implicit using指令
隐式 using 功能会自动为您正在构建的项目类型添加常用的global using。
要启用隐式使用,在项目文件.csproj中设置以下属性
<PropertyGroup><!-- Other properties like OutputType and TargetFramework --><ImplicitUsings>enable</ImplicitUsings></PropertyGroup>
二、命名空间写成语句
从 C# 10 开始,可以将文件范围的命名空间写成语句,后跟分号且不使用大括号:
namespace YongChui.Seeng;class CoolClass // Note: no indentation{ ... }
三、常量字符串内插
你可以给 const string 使用字符串插值了,非常方便,例如:
Const string dx="hello,world";Const string dy=$"{dx},cite";
四、起用记录结构类型
解决了 record 只能给 class 而不能给 struct 用的问题,用 record 定义 struct 的好处其实有很多,
你无需重写 GetHashCode 和 Equals 之类的方法了。例如:
Record struct Novaengr(int Age,int Weght);
五、Struct扩展
C# 10 增加了struct的特性,可让结构和类之间有更好的一致性。
这些新功能包括parameterless constructors、field initializers、record structs和with表达式。
1、在 C# 10 之前,每个结构体都有一个隐式公共无参数构造函数,用来将结构体的字段设置为default. 导致不能像class那样, 为struct上创建无参数构造函数。
C# 10 允许在struct上创建无参数结构构造函数。不过必须是public, 而且不能是partial:
public struct WindCity{ public WindCity () { City = "JinXiang"; } public string City { get; init; }}
2、不仅可以在无参数构造函数中初始化字段,也可以通过字段或属性初始化程序初始化它们:
public struct WindCity{ public string City { get; init; } = " JinXiang ";}
3、记录类中的ToString()前增加了sealed修饰符
从 C# 10 开始,该方法可以包含 Sealed 修饰符,用来阻止编译器为任何派生记录实现一个合成的ToString()方法。
4、结构支持with 表达式
C# 10 中,所有结构,包括记录结构以及匿名类型都支持了with表达式:
var andren = ren with { LastName = "Kristensen" };
这将返回一个具有新值的新实例。可以更新任意数量的值。未设置的值将保留与初始实例相同的值。
六、Lambda 扩展
1. 支持 attributes
lambda 可以带 attribute 了:
df = [Ying] (dx) => dx; // 给 lambda 设置df = [return: Ying] (dx) => dx; // 给 lambda 返回值设置df = ([Ying] dx) => dx; // 给 lambda 参数设置
2. 支持指定返回值类型
此前 C# 的 lambda 返回值类型靠推导,C# 10 开始允许在参数列表最前面显示指定 lambda 类型了:
dy= int () => 4;
3. 支持 ref 、in 、out 等修饰
dy = ref int (ref int dx) => ref dx; // 返回一个参数的引用
4. 头等函数
函数可以隐式转换到 delegate,于是函数上升至头等函数:
void Ying() { Console.WriteLine("hello"); }var dx = Ying;dx(); // hello
5. 自然委托类型
lambda 现在会自动创建自然委托类型,于是不再需要写出类型了。
var df = () => 1; // Func<int>var dg = string (int dx, string dy) => $"{dy}{dx}"; // Func<int, string, string>var dh = "test".GetHashCode; // Func<int>
七、attribute支持泛型
是的你没有看错,C# 的 attributes 支持泛型了,不过 .NET 6 中将以预览特定放出,因此需要
<LangVersion>preview</LangVersion>: class ChinaAttribute<T> : Attribute{ public T Data { get; } public ChinaAttribute(T data) { Data = data; }}
然后你就能这么用了:
[China<int>(3)][China<float>(4.5f)][China<string>("hello")]
八、其他增强
1、tuple 支持混合定义和使用
2、接口支持抽象静态方法
3、允许在方法上指定 AsyncMethodBuilder
C# 10 将允许方法上使用 [AsyncMethodBuilder(...)] 来使用你
自己实现的 async method builder,代替自带的 Task 或者 ValueTask 的异步方法构造器。
4、增强的 #line pragma
509fcbff-9f80-4758-9832-e73b99f6f1ac|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags: C#, 程序, 代码, 泛型, 方法, 接口, 类, 命名空间
IT技术