.NET 8中bool是否为blittable类型?为何测试代码未抛异常?
为什么
GCHandle.Alloc(new bool(), GCHandleType.Pinned)不抛出异常? 核心原因
.NET 5+(包括你使用的.NET 8)的跨平台运行时对单个值类型的固定逻辑做了调整:即使类型被标记为非blittable(比如bool),固定单个值类型实例时不会抛出ArgumentException。
这是因为:
- 值类型本身是值语义,单个实例的内存布局连续且可直接访问,固定操作不需要处理复杂的引用或非连续内存结构。
- 文档中提到的“通过固定GCHandle判断blittable”的规则,更多适配.NET Framework的行为,或者针对包含非blittable成员的复杂引用类型/值类型,而非单个基础值类型。
验证bool非blittable的正确方式
要准确验证bool的blittable属性,应使用Marshal.IsBlittable方法,在你的环境中运行会返回false,完全符合文档描述:
using System.Runtime.InteropServices; Console.WriteLine(Marshal.IsBlittable(typeof(bool))); // 输出: False
补充说明
文档中GCHandle.Alloc抛出ArgumentException的场景,主要适用于:
- 非字符串的引用类型,且类型本身或其成员包含非blittable内容。
- 包含非blittable成员的复杂值类型(比如自定义结构体中包含
string或其他非blittable类型字段)。
而单个基础值类型(即使是非blittable),在.NET Core及后续版本中允许被固定,因为这类操作不会引发内存安全问题。
内容的提问来源于stack exchange,提问作者sweemer
相关产品推荐
相关产品推荐

