C# 9.0 原生大小整数是什么?nint与nuint相关问题咨询
C# 9.0 原生大小整数常见问题解答
什么是原生大小整数,nint和nuint分别指代什么?
原生大小整数是C# 9.0新增的整数类型族,核心特点是存储长度和运行程序的CPU架构完全对齐:32位系统下占4字节,64位系统下占8字节,和系统指针的长度完全一致。
nint是带符号原生大小整数的语法别名,底层对应.NET的System.IntPtr类型,取值范围随架构变化:32位环境下为-2^31 ~ 2^31-1,64位环境下为-2^63 ~ 2^63-1nuint是无符号原生大小整数的语法别名,底层对应.NET的System.UIntPtr类型,取值范围随架构变化:32位环境下为0 ~ 2^32-1,64位环境下为0 ~ 2^64-1
nint/nuint的适用场景和使用优势有哪些?
适用场景
- 原生API互操作:调用C/C++编写的系统接口、第三方原生SDK时,大量接口的参数、返回值都是和系统指针长度一致的整数,用这两个类型可以避免32/64位架构下的类型适配错误
- 高性能内存操作:开发非托管内存管理器、操作裸指针、编写
Span<T>/Memory<T>相关的高性能逻辑时,用原生大小整数存储内存地址、偏移量和底层实现逻辑完全匹配 - 旧代码兼容:和历史使用
IntPtr/UIntPtr的代码交互时,不需要做额外的类型转换即可完成数值运算
核心优势
- 语法更易读:相比冗长的
IntPtr/UIntPtr,短别名可以一眼识别出是整数类型,降低代码理解成本 - 运算支持完善:
IntPtr本身仅支持非常有限的算术运算,nint/nuint支持普通整数的所有加减乘除、位运算、比较操作,不用反复转型,减少编码错误 - 跨架构适配成本低:不需要手动写条件编译区分不同架构下的整数长度,编译器会自动根据目标架构生成对应长度的类型,降低跨平台开发的维护成本
- 零运行时开销:这两个类型只是
IntPtr/UIntPtr的语法糖,运行时没有额外的封装成本,性能和原生指针类型完全一致
内容的提问来源于stack exchange,提问作者Furkan Öztürk
相关产品推荐
相关产品推荐

