2009-08-24 8 views
10

VS:人々はIntPtrを使用どこでも私が見る、私が代わりにUIntPtrを使うべき理由はありますか?への十分な理由があるだろうようのIntPtrこれは簡単であるべきUIntPtr

+0

うわー、私はUIntPtrがあることさえ知りませんでした。私たちは.NETのもっとも役に立たない機能のためにそれを指名できますか? – ja72

答えて

8

は思えません。ドキュメントから:UIntPtr型がいない間

備考

...

のIntPtr型はCLSに準拠し、 です。 のみ 言語ランタイムでIntPtrタイプが使用されています。 UIntPtr型は、ほとんどのIntPtr タイプと 建築対称性を維持するために提供さ です。

+1

この回答は間違っている間は正しいとマークされています。 – xamid

7

ウェルaccording to MicrosoftUIntPtrは、ほとんどがアーキテクチャの対称性のために提供されています。別の興味深い点は、UIntPtrがCLSに準拠していないことです。表面には

のIntPtrが好ましい選択肢であると思われます。しかし、ポインタ演算を実行することがわかっている場合は、UIntPtrがより良い選択になる可能性があります。なぜなら、オフチャンスでは、負の値を処理するあいまいな問題があるからです。

1

大きな違いがあります。たとえば、新しいUIntPtr(0xC01E0001)は3223191553にポインタを返しますが、IntPtr(0xC01E0001)の結果、System.OverflowExceptionが発生します。「算術演算でオーバーフローが発生しました」。つまり、0xC01E0001がMaxValuefürInt32より大きいためです。 1はまだ、このようなポインタを望んでいるのであれば、負の整数は、あなたの質問に答えるために

unchecked((IntPtr)(int)0xC01E0001) 

のように、のIntPtrのための内部値として使用する必要があります

:Int32.MaxValueをより大きい値の場合、それは簡単で、何らかの形でUIntPtrを使うのがきれいです。ポインタは常に符号なしとみなされるので、おそらく常に最良の解決策です。

+0

OverflowExceptionを 'var p1 = new IntPtr(0xC01E0001);で再現できません。 var p2 =(IntPtr)0xC01E0001; ' –

関連する問題