You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C# 7.3中ref struct的定义及特性相关技术咨询

Understanding ref struct in C# 7.3

你猜的完全没错!ref struct确实是仅能分配在栈上的结构体,永远不会被移到堆上——这也是它所有限制规则的核心原因。下面给你梳理下权威的细节:

核心特性与约束

  • 栈内存专属:编译器会强制保证ref struct的实例只能存在于栈内存中,比如局部变量、方法参数,或是作为另一个ref struct的字段。这意味着它完全脱离GC的追踪范围,能带来显著的性能优势,也是Span<T>这类高性能内存操作类型的实现基础。
  • 禁止装箱操作:因为装箱会把值类型实例移到堆上,所以ref struct无法转换为objectdynamic类型,也不能实现任何接口——这些操作本质上都会触发装箱行为。
  • 不能作为普通类型的成员:普通类或非ref struct的结构体可能被分配到堆上,所以ref struct不能作为它们的字段或自动属性,否则就打破了栈-only的规则。
  • 受限的使用场景:不能在异步方法、迭代器中使用ref struct——因为异步方法和迭代器的执行上下文可能被挂起,涉及堆上的状态保存,编译器会直接禁止这类场景。

你的代码验证

你写的这段代码完全符合C# 7.3的语法规则:

public ref struct MyStruct { int x; }

编译器会自动帮你强制执行所有栈-only约束,比如你尝试把它赋值给object变量时,会直接抛出编译错误。

设计初衷

ref struct主要是为了支持像Span<T>ReadOnlySpan<T>这类高性能内存操作类型而生。这些类型需要直接操作连续内存块(可能是栈内存、堆内存甚至非托管内存),同时要避免GC的开销和内存移动——栈上的内存地址是固定的,不会被GC压缩移动,刚好能安全持有内存指针,满足这类场景的需求。

内容的提问来源于stack exchange,提问作者M.kazem Akhgary

火山引擎 最新活动