這應該很簡單:我看到到處都有人使用IntPtr
,是否有任何理由我應該使用UIntPtr
而不是?IntPtr vs UIntPtr
回答
似乎不會有一個很好的理由。從文檔:
備註
...
的IntPtr的類型是符合CLS, 而UIntPtr類型不是。 只有 IntPtr類型用於通用 語言運行時。 UIntPtr類型爲 主要提供以維持 架構對稱類型與IntPtr 類型。
這個答案在不正確的時候被標記爲正確。 – xamid 2015-07-09 23:47:08
好吧according to MicrosoftUIntPtr
主要用於建築對稱。另一個有趣的問題是UIntPtr
不符合CLS標準。
從表面上看,IntPtr似乎是首選。然而,如果你知道你會做指針算術,那麼UIntPtr可能是一個更好的選擇,因爲在不可能的情況下,處理負值時會出現一些模糊的問題。
有一個很大的區別..例如,新的UIntPtr(0xC01E0001)
會導致指針在3223191553,但IntPtr(0xC01E0001)
會導致System.OverflowException:「算術運算導致溢出」。也就是說,因爲0xC01E0001大於Int32的MaxValue。
所以如果仍然想這樣的一個指針,必須作爲IntPtr的內在價值,像
unchecked((IntPtr)(int)0xC01E0001)
要回答你的問題負整數:對於數值大於Int32.MaxValue更容易和不知何故更清潔使用UIntPtr。它可能總是最好的解決方案,因爲指針總是被認爲是無符號的。
無法通過var var p1 = new IntPtr(0xC01E0001)重現OverflowException; var p2 =(IntPtr)0xC01E0001;' – 2017-08-11 10:10:19
- 1. 如何在C#中將UIntPtr對象轉換爲IntPtr?
- 2. const int *&vs typedef int * IntPtr
- 3. C#指針VS的IntPtr
- 4. typedef int * intptr OR typedef int * intptr;
- 5. C#指針超過IntPtr限制
- 6. API調用的SafeProcessHandle和IntPtr的區別
- 7. IntPtr addition
- 8. 位屏蔽IntPtr
- 9. 循環IntPtr?
- 10. srp6 IntPtr到BigInteger
- 11. 從IntPtr的
- 12. Determine DLL分配IntPtr
- 13. Emgu OpenCV Intptr到IplImage?
- 14. 方法:「IntPtr的System.Fabric.SecurityCredentialExtension.ToNative
- 15. UInt32的到IntPtr的
- 16. C#HEX值到IntPtr
- 17. 的IntPtr投與新
- 18. 不使用IntPtr的SafeHandle
- 19. 將IntPtr轉換爲CWPSTRUCT
- 20. 的IntPtr到回調函數
- 21. IntPtr不包含本地值
- 22. IntPtr字符串和長?
- 23. 通過COM interop傳遞IntPtr
- 24. 查找任務欄的IntPtr
- 25. IntPtr,SafeHandle和HandleRef - 解釋
- 26. intptr的指針地址
- 27. IntPtr到三維數組
- 28. 正確比較IntPtr與int
- 29. C#,對於一個IntPtr
- 30. C#中無法解析IntPtr#
哇,我甚至不知道有一個'UIntPtr'。我們可以提名它爲'.NET'的最無用功能嗎? – ja72 2014-08-30 19:50:58