IntPtr vs UIntPtr

Это должно быть просто: я вижу, что везде люди используют IntPtr, есть ли какая-то причина, по которой я должен использовать UIntPtr?

Ответ 1

Кажется, не было бы веских оснований. Из документов:

Примечания

...

Тип IntPtr является CLS-совместимым, а тип UIntPtr - нет. Только тип IntPtr используется в общем язык выполнения. Тип UIntPtr в основном для поддержания архитектурная симметрия с IntPtr тип.

Ответ 2

Ну в соответствии с Microsoft UIntPtr предоставляется в основном для архитектурной симметрии. Еще один интересный момент: UIntPtr не совместим с CLS.

На поверхности кажется, что IntPtr является предпочтительным вариантом. Однако, если вы знаете, что будете выполнять арифметику указателей, тогда UIntPtr может быть лучшим выбором, поскольку вовремя появилась какая-то неясная проблема, касающаяся отрицательных значений.

Ответ 3

Существует большая разница. Например, новый UIntPtr(0xC01E0001) приводит к указателю на 3223191553, но IntPtr(0xC01E0001) приводит к исключению System.OverflowException: "Арифметическая операция привела к переполнению". То есть, поскольку 0xC01E0001 больше MaxValue для Int32.

Итак, если вам еще нужен такой указатель, отрицательное целое число должно использоваться как внутреннее значение для IntPtr, например

unchecked((IntPtr)(int)0xC01E0001)

Чтобы ответить на ваш вопрос: для значений, больших, чем Int32.MaxValue, проще и как-то чище использовать UIntPtr. Это, вероятно, всегда лучшее решение, поскольку указатели всегда считаются беззнаковыми.