Это должно быть просто: я вижу, что везде люди используют IntPtr
, есть ли какая-то причина, по которой я должен использовать UIntPtr
?
IntPtr vs 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. Это, вероятно, всегда лучшее решение, поскольку указатели всегда считаются беззнаковыми.