c#发展

注册

 

发新话题 回复该主题

NET9新功能体验二 [复制链接]

1#

书接上回,我们继续来聊聊.NET9和C#1带来的新变化。

01、新的泛型约束allowsrefstruct

这是在C#1中,引入的一项新的泛型约束功能,允许对泛型类型参数应用refstruct约束。

可能这样说不够直观,简单来说就是SpanT、ReadOnlySpanT类型,我们直接看下面的代码示例:

在没有新的约束allowsrefstruct之前,SpanT是不能当参数传入的,直接编译错误,但是有了新约束则就可以支持SpanT参数了。

因此C#1中引入了whereT:allowsrefstruct泛型约束后使得我们可以对泛型参数类型进行更加精细的控制。通过这个特性,泛型方法或类就可以接受refstruct类型,如SpanT、ReadOnlySpanT等,因为这些类型是在栈上分配内存,能够提供更高效的内存管理和更快的执行速度,所以这个新特性特别适用于高性能、内存密集型的泛型方法和类,可以有效避免堆分配和垃圾回收的开销。

02、refstruct接口

在C#1之前,refstruct是无法实现接口的。从C#1开始,refstruct可实现接口,但必须遵循ref安全性规则。例如,由于需要装箱转换,因此无法将refstruct类型转换为接口类型。

如上图,refstruct类型可以实现IInterface接口,但是当用IInterface接口去接收RefStructInterface类型时则直接编译报错,无论直接接收还是强制转换都是不支持的。

0、在异步方法中使用refstruct

从C#1开始,refstruct可以在异步方法中使用,但是有一个限制:它们不能在与await表达式同一个代码块中交互。这是为了避免refstruct在跨越异步操作时引发内存安全问题,因为refstruct类型的实例通常存储在栈上,并且不能在异步操作中跨越栈帧。

下面代码是在异步方法中使用refstruct示例:

04、在迭代器中使用refstruct

从C#1开始,允许在迭代器方法中使用refstruct,前提是满足以下条件:不能在包含yieldreturn的代码段中使用它们。这是因为yieldreturn语句会导致方法的执行暂停并在以后继续执行。如果在这期间使用了refstruct,可能会导致这些类型的生命周期管理出现问题(例如跨越栈帧的切换)。为了避免这种问题,C#1规定,如果要在迭代器方法中使用refstruct,则不能在yieldreturn语句所在的代码段中操作它们。

下面是在迭代器中使用refstruct示例代码:

05、部分属性、部分索引器

早在C#2就引入了部分类,在C#引入了部分方法,到现在C#1又新增了部分属性和部分索引器。

这一改进这意味着允许属性和索引器可以跨越多个部分进行声明和实现。这给自动生成代码或分离

分享 转发
TOP
发新话题 回复该主题