IntPtr与UIntPtr的区别

14
这很简单:我看到很多地方都使用IntPtr,那么我应该使用UIntPtr有什么原因吗?

哇,我甚至不知道有一个 UIntPtr。我们能否提名它为 .NET 最无用的功能? - John Alexiou
3个回答

8

看起来没有什么好的理由这样做。根据文档:

备注

...

IntPtr类型符合CLS标准,而UIntPtr类型不符合。只有IntPtr类型在公共语言运行时中使用。提供UIntPtr类型主要是为了与IntPtr类型保持结构对称性。


3
这个答案被标记为正确,但其实是错误的。 - xamid

8

据微软公司称,UIntPtr主要是为了架构对称性而提供的。另一个有趣的点是UIntPtr不符合CLS。

表面上看,IntPtr似乎是首选选项。但是,如果您知道将进行指针算术运算,则UIntPtr可能是更好的选择,因为在处理负值时可能会出现一些模糊的问题。


2

有一个很大的区别.. 例如,在32位应用程序上,新建UIntPtr(0xC01E0001)会导致指针位于3223191553,而IntPtr(0xC01E0001)会导致System.OverflowException: "算术运算导致溢出"。这是因为0xC01E0001大于Int32的MaxValue。

因此,如果仍然需要这样的指针,就需要使用负整数作为IntPtr的内部值,例如

unchecked((IntPtr)(int)0xC01E0001)

回答您的问题:对于大于Int32.MaxValue的值,使用UIntPtr更加容易且更加清晰。这可能总是最好的解决方案,因为指针始终被认为是无符号的。

无法通过 var p1 = new IntPtr(0xC01E0001); var p2 = (IntPtr)0xC01E0001; 重现 OverflowException。 - Chris Xue
@ChrisXue 这可能是因为您使用的是 64 位架构,而我只使用了 32 位。因此,本质上,我使用了 Int32,而您使用了 Int64。要产生溢出,您需要更大的数字。我已经编辑了我的答案。 - xamid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接