C# 1 Ref Struct Interfaces
C# 1 Ref Struct Interfaces
C# 1 Ref Struct Interfaces
C# 从 7.2 开始引入了 ref struct
,ref struct
只能分配在栈上,不能被装箱,因为不能被装箱之前的版本中 ref struct
是不能实现接口的,在转成接口的时候会导致发生装箱,这是不被允许的,而我们在做一些设计的时候往往会使用到接口,用接口定义契约 contract,C# 1 开始我们可以允许 ref struct
实现接口,并且增加了可以作为泛型类型约束允许 ref struct
类型
来看一个简单的示例:
代码语言: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
来说是不被允许的
代码语言:javascript代码运行次数:0运行复制CS150: Argument 1: cannot convert from 'CSharp1Samples.RefStructAge' to 'CSharp1Samples.IAge'
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
这一特性可以有助于避免 struct 被装箱导致性能问题,可以更好地利用 ref struct
带来的性能改进和编译器的约束检查
可以实现接口也有有助于在设计前面更加专注在更核心的接口设计上无需关心实现方式,实现的时候选择基于 class 实现也可以基于 ref struct
来实现, dotnet runtime 的一些 library 里的泛型参数也新增支持了这一特性,例如:
library-ref-struct
后续的 runtime library 应该也会基于这一特性优化一些原来基于 class 的实现,转而使用基于 ref struct 的实现来优化性能
对前面的示例做一个简单的 benchmark
- .0/
- .cs
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
推荐阅读
留言与评论(共有 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分钟前 发表 |
因为接口默认实现方法需要转成接口才能使用 |