IntPtr与UIntPtr

时间:2009-08-24 02:57:47

标签: c# .net vb.net

这应该很简单:我看到所有人都使用IntPtr,有什么理由我应该使用UIntPtr吗?

3 个答案:

答案 0 :(得分:8)

似乎没有充分的理由。来自文档:

  

<强>说明

     

...

     

IntPtr类型符合CLS标准,   虽然UIntPtr类型不是。的 仅   IntPtr类型用于常见的   语言运行时 。 UIntPtr类型是   提供主要是为了维护   与IntPtr建筑对称   类型。

答案 1 :(得分:7)

according to Microsoft UIntPtr主要用于建筑对称。另一个有趣的观点是UIntPtr不符合CLS。

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

答案 2 :(得分:1)

存在很大差异。例如,在32位应用程序上,新UIntPtr(0xC01E0001)导致指针位于3223191553,但IntPtr(0xC01E0001)导致System.OverflowException:&#34;算术运算导致溢出&#34;。也就是说,因为0xC01E0001大于Int32的MaxValue。

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

unchecked((IntPtr)(int)0xC01E0001)

回答你的问题:对于大于Int32.MaxValue的值,使用UIntPtr更容易,也更简洁。它可能总是最好的解决方案,因为指针总是被认为是无符号的。