【问题标题】:IntPtr vs UIntPtrIntPtr 与 UIntPtr
【发布时间】:2009-08-24 02:57:46
【问题描述】:

这应该很简单:我看到到处有人使用IntPtr,我有什么理由应该改用UIntPtr

【问题讨论】:

  • 哇,我什至不知道有一个UIntPtr。能不能提名.NET这个最没用的功能?

标签: c# .net vb.net


【解决方案1】:

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

备注

...

IntPtr 类型符合 CLS, 而 UIntPtr 类型不是。 仅限 IntPtr 类型用于常见的 语言运行时。 UIntPtr 类型是 主要用于维护 与 IntPtr 的架构对称 输入。

【讨论】:

  • 这个答案被标记为正确而错误。
【解决方案2】:

according to Microsoft UIntPtr 主要是为了架构对称性而提供的。另一个有趣的点是UIntPtr 不符合 CLS。

从表面上看,IntPtr 似乎是首选选项。但是,如果您知道您将进行指针运算,那么 UIntPtr 可能是更好的选择,因为在处理负值时存在一些晦涩难懂的问题。

【讨论】:

    【解决方案3】:

    有很大的不同。例如,在 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
    • @ChrisXue 这可能是因为您使用的是 64 位架构,而我只使用 32 位。所以,本质上,我使用了 Int32,你使用了 Int64。要产生溢出,您需要更大的数字。我已经编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多