C#中无Unsafe类,指针操作依赖unsafe上下文、fixed、stackalloc及System.Runtime.CompilerServices.Unsafe静态类,需启用不安全代码支持,用于高性能场景但需谨慎管理内存与生命周期。

Unsafe 类本身并不存在于 C# 标准库中。这是一个常见误解。C# 中没有名为 Unsafe 的类来“封装”指针操作。真正支持指针和底层内存操作的是 unsafe 上下文(unsafe context),配合 fixed、stackalloc、指针类型(如 int*)以及 System.Runtime.CompilerServices.Unsafe 这个静态类(需引用 System.Runtime.CompilerServices.Unsafe NuGet 包)。
unsafe 上下文:开启指针操作的前提
要在 C# 中使用指针,必须将代码标记为 unsafe,并在编译时启用不安全代码支持(项目文件中设置 <allowunsafeblocks>true</allowunsafeblocks> 或命令行加 /unsafe)。
- 可在方法、类型或代码块级别使用
unsafe关键字 - 例如:
unsafe { int* p = &x; }或unsafe static void Copy(int* src, int* dst, int len) - 直接解引用、指针算术、类型转换(如
byte* → char*)都只能在 unsafe 块内进行
System.Runtime.CompilerServices.Unsafe:高性能的无检查内存操作
这个静态类不是语法糖,而是提供绕过 JIT 某些边界检查的底层原语,常用于高性能库(如 Spanunsafe 关键字本身,但调用它的方法通常需要在 unsafe 上下文中使用其返回的指针。
- 常用方法:
Unsafe.As<tfrom tto>(ref TFrom source)</tfrom>(零开销类型重解释) -
Unsafe.Add<t>(T* pointer, int offset)</t>(比p + offset更通用,支持泛型指针) -
Unsafe.Read<t>(void* address)</t>和Unsafe.Write<t>(void* address, T value)</t>(对齐无关的读写) - ⚠️ 注意:它不保证线程安全,也不做空指针或越界检查——出错即崩溃或未定义行为
fixed 语句:固定托管对象地址,防止 GC 移动
托管堆上的对象可能被垃圾回收器移动,因此要获取其地址并用指针访问,必须用 fixed 将其“钉住”(pin)。
标签: c# unsafe类 栈 作用域 编译错误 垃圾回收器 标准库
还木有评论哦,快来抢沙发吧~