您现在的位置是:首页 > 编程 > 

C# 1 Ref Struct Interfaces

2025-07-20 07:38:41
C# 1 Ref Struct Interfaces C# 1 Ref Struct InterfacesIntroC# 从 7.2 开始引入了 ref struct,ref struct 只能分配在栈上,不能被装箱,因为不能被装箱之前的版本中 ref struct 是不能实现接口的,在转成接口的时候会导致发生装箱,这是不被允许的,而我们在做一些设计的时候往往会使用到接口,用接口定义契约 co

C# 1 Ref Struct Interfaces

C# 1 Ref Struct Interfaces

Intro

C# 从 7.2 开始引入了 ref structref struct 只能分配在栈上,不能被装箱,因为不能被装箱之前的版本中 ref struct 是不能实现接口的,在转成接口的时候会导致发生装箱,这是不被允许的,而我们在做一些设计的时候往往会使用到接口,用接口定义契约 contract,C# 1 开始我们可以允许 ref struct 实现接口,并且增加了可以作为泛型类型约束允许 ref struct 类型

Sample

来看一个简单的示例:

代码语言:javascript代码运行次数:0运行复制
file interface IAge
{
    public int GetAge();
}

file ref struct Age : IAge
{
    public int GetAge() => 1;
}

使用的地方需要这样用:

代码语言:javascript代码运行次数:0运行复制
private static void PrintAge<TAge>(TAge age)
    where TAge : IAge, allows ref struct
{
    Cole.WriteLine(age.GetAge());
}

方法需要声明为泛型参数,并且要指定泛型约束 allows ref struct

我们不能直接声明参数为对应的接口类型,如 IAge,这会导致 ref struct 被装箱,编译器会报错,例如我们这样定义,调用的时候编译器就会报错,这也意味着 ref struct 不能使用接口默认实现方法,因为接口默认实现方法需要转成接口才能使用,而转接口就意味着要发生装箱,对于 ref struct 来说是不被允许的

CS150: Argument 1: cannot convert from 'CSharp1Samples.RefStructAge' to 'CSharp1Samples.IAge'

代码语言:javascript代码运行次数:0运行复制
private static void PrintAge0(IAge age)
{
    Cole.WriteLine(age.GetAge());
}

CS150 error

另外需要显式声明 allows ref struct 默认是不允许将 ref struct 用作泛型类型参数的,不声明也会导致编译器报错

CS9244: The type 'RefStructAge' may not be a ref struct or a type parameter allowing ref structs in order to use it as parameter 'TAge' in the generic type or method 'RefStructInterfaceSample.PrintAge(TAge)'

CS9244-error

除了方法我们也可以声明 Property

代码语言:javascript代码运行次数:0运行复制

internal interface IAge
{
    int Ageum { get; }
    int GetAge();
}

internal ref struct RefStructAge : IAge
{
    public int Ageum => 1;

    public int GetAge() => Ageum;
}

如果接口里有定义默认实现方法,在定义 ref struct 的时候就会报错

Interface default implemented method

More

这一特性可以有助于避免 struct 被装箱导致性能问题,可以更好地利用 ref struct 带来的性能改进和编译器的约束检查

可以实现接口也有有助于在设计前面更加专注在更核心的接口设计上无需关心实现方式,实现的时候选择基于 class 实现也可以基于 ref struct 来实现, dotnet runtime 的一些 library 里的泛型参数也新增支持了这一特性,例如:

library-ref-struct

后续的 runtime library 应该也会基于这一特性优化一些原来基于 class 的实现,转而使用基于 ref struct 的实现来优化性能

对前面的示例做一个简单的 benchmark

References
  • .0/
  • .cs
本文参与 腾讯云自媒体同步曝光计划,分享自。原始发表:2024-10-2,如有侵权请联系 cloudcommunity@tencent 删除泛型接口c#refstruct

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1129983.html

相关标签:无
上传时间: 2025-07-18 16:21:35
留言与评论(共有 18 条评论)
本站网友 影集模板
6分钟前 发表
可以更好地利用 ref struct 带来的性能改进和编译器的约束检查可以实现接口也有有助于在设计前面更加专注在更核心的接口设计上无需关心实现方式
本站网友 刘德福
9分钟前 发表
这会导致 ref struct 被装箱
本站网友 青岛出租房屋网站
17分钟前 发表
可以更好地利用 ref struct 带来的性能改进和编译器的约束检查可以实现接口也有有助于在设计前面更加专注在更核心的接口设计上无需关心实现方式
本站网友 乳山二手房
1分钟前 发表
分享自
本站网友 福州建发
30分钟前 发表
对于 ref struct 来说是不被允许的CS150
本站网友 王力安全门
5分钟前 发表
因为接口默认实现方法需要转成接口才能使用
本站网友 玫瑰和月季的区别
4分钟前 发表
ref struct 只能分配在栈上
本站网友 金沙江创投
3分钟前 发表
这也意味着 ref struct 不能使用接口默认实现方法
本站网友 三亚酒店预定
12分钟前 发表
转而使用基于 ref struct 的实现来优化性能对前面的示例做一个简单的 benchmarkReferences.0/.cs本文参与 腾讯云自媒体同步曝光计划
本站网友 长沙找房
3分钟前 发表
实现的时候选择基于 class 实现也可以基于 ref struct 来实现
本站网友 andylau
3分钟前 发表
在转成接口的时候会导致发生装箱
本站网友 avater
3分钟前 发表
实现的时候选择基于 class 实现也可以基于 ref struct 来实现
本站网友 蒉莺春
10分钟前 发表
不能被装箱
本站网友 余波未平
22分钟前 发表
因为不能被装箱之前的版本中 ref struct 是不能实现接口的
本站网友 appsync
17分钟前 发表
调用的时候编译器就会报错
本站网友 动脉硬化症
21分钟前 发表
实现的时候选择基于 class 实现也可以基于 ref struct 来实现
本站网友 裕华二手房
30分钟前 发表
因为接口默认实现方法需要转成接口才能使用