这很简单:我看到很多地方都使用
IntPtr
,那么我应该使用UIntPtr
有什么原因吗?看起来没有什么好的理由这样做。根据文档:
备注
...
IntPtr类型符合CLS标准,而UIntPtr类型不符合。只有IntPtr类型在公共语言运行时中使用。提供UIntPtr类型主要是为了与IntPtr类型保持结构对称性。
据微软公司称,UIntPtr主要是为了架构对称性而提供的。另一个有趣的点是UIntPtr
不符合CLS。
表面上看,IntPtr似乎是首选选项。但是,如果您知道将进行指针算术运算,则UIntPtr可能是更好的选择,因为在处理负值时可能会出现一些模糊的问题。
有一个很大的区别.. 例如,在32位应用程序上,新建UIntPtr(0xC01E0001)
会导致指针位于3223191553,而IntPtr(0xC01E0001)
会导致System.OverflowException: "算术运算导致溢出"。这是因为0xC01E0001大于Int32的MaxValue。
因此,如果仍然需要这样的指针,就需要使用负整数作为IntPtr的内部值,例如
unchecked((IntPtr)(int)0xC01E0001)
var p1 = new IntPtr(0xC01E0001); var p2 = (IntPtr)0xC01E0001;
重现 OverflowException。 - Chris Xue
UIntPtr
。我们能否提名它为.NET
最无用的功能? - John Alexiou