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 包)。
要在 C# 中使用指针,必须将代码标记为 unsafe,并在编译时启用不安全代码支持(项目文件中设置 true 或命令行加 /unsafe)。
unsafe 关键字unsafe { int* p = &x; } 或 unsafe static void Copy(int* src, int* dst, int len)
byte* → char*)都只能在 unsafe 块内进行这个静态类不是语法糖,而是提供绕过 JIT 某些边界检查的底层原语,常用于高性能库(如 Spanunsafe 关键字本身,但调用它的方法通常需要在 unsafe 上下文中使用其返回的指针。
Unsafe.As(ref TFrom source) (零开销类型重解释)Unsafe.Add(T* pointer, int offset) (比 p + offset 更通用,支持泛型指针)U
nsafe.Read(void* address) 和 Unsafe.Write(void* address, T value) (对齐无关的读写)托管堆上的对象可能被垃圾回收器移动,因此要获取其地址并用指针访问,必须用 fixed 将其“钉住”(pin)。
string、固定大小缓冲区(fixed int buffer[128];)等可固定的类型fixed (byte* ptr = bytes) { /* 使用 ptr */ } —— 离开作用域自动解钉var obj = new MyClass(); fixed (MyClass* p = &obj))使用 fixed,会编译错误
用于快速分配小块未初始化内存,生命周期绑定到当前方法栈帧,无需 GC 管理,也无需手动释放(但不能返回给调用方)。
int* arr = stackalloc int[1024];
const 表达式(C# 7.2+ 支持局部常量)基本上就这些。指针操作不是日常开发必需,但在高性能计算、互操作(P/Invoke)、底层集合实现或序列化库中很关键。安全第一:优先用 Span、Memory 和 ReadOnlySpan 替代裸指针;非用不可时,务必理解生命周期、内存所有权和线程约束。