2009-08-24 64 views
10

這應該很簡單:我看到到處都有人使用IntPtr,是否有任何理由我應該使用UIntPtr而不是?IntPtr vs UIntPtr

+0

哇,我甚至不知道有一個'UIntPtr'。我們可以提名它爲'.NET'的最無用功能嗎? – ja72 2014-08-30 19:50:58

回答

8

似乎不會有一個很好的理由。從文檔:

備註

...

的IntPtr的類型是符合CLS, 而UIntPtr類型不是。 只有 IntPtr類型用於通用 語言運行時。 UIntPtr類型爲 主要提供以維持 架構對稱類型與IntPtr 類型。

+1

這個答案在不正確的時候被標記爲正確。 – xamid 2015-07-09 23:47:08

7

好吧according to MicrosoftUIntPtr主要用於建築對稱。另一個有趣的問題是UIntPtr不符合CLS標準。

從表面上看,IntPtr似乎是首選。然而,如果你知道你會做指針算術,那麼UIntPtr可能是一個更好的選擇,因爲在不可能的情況下,處理負值時會出現一些模糊的問題。

1

有一個很大的區別..例如,新的UIntPtr(0xC01E0001)會導致指針在3223191553,但IntPtr(0xC01E0001)會導致System.OverflowException:「算術運算導致溢出」。也就是說,因爲0xC01E0001大於Int32的MaxValue。

所以如果仍然想這樣的一個指針,必須作爲IntPtr的內在價值,像

unchecked((IntPtr)(int)0xC01E0001) 

要回答你的問題負整數:對於數值大於Int32.MaxValue更容易和不知何故更清潔使用UIntPtr。它可能總是最好的解決方案,因爲指針總是被認爲是無符號的。

+0

無法通過var var p1 = new IntPtr(0xC01E0001)重現OverflowException; var p2 =(IntPtr)0xC01E0001;' – 2017-08-11 10:10:19