【发布时间】:2009-08-24 02:57:46
【问题描述】:
这应该很简单:我看到到处有人使用IntPtr,我有什么理由应该改用UIntPtr?
【问题讨论】:
-
哇,我什至不知道有一个
UIntPtr。能不能提名.NET这个最没用的功能?
这应该很简单:我看到到处有人使用IntPtr,我有什么理由应该改用UIntPtr?
【问题讨论】:
UIntPtr。能不能提名.NET这个最没用的功能?
似乎没有充分的理由这样做。来自文档:
备注
...
IntPtr 类型符合 CLS, 而 UIntPtr 类型不是。 仅限 IntPtr 类型用于常见的 语言运行时。 UIntPtr 类型是 主要用于维护 与 IntPtr 的架构对称 输入。
【讨论】:
according to Microsoft UIntPtr 主要是为了架构对称性而提供的。另一个有趣的点是UIntPtr 不符合 CLS。
从表面上看,IntPtr 似乎是首选选项。但是,如果您知道您将进行指针运算,那么 UIntPtr 可能是更好的选择,因为在处理负值时存在一些晦涩难懂的问题。
【讨论】:
有很大的不同。例如,在 32 位应用程序上,new 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