Это должно быть просто: я вижу везде, где люди используют IntPtr
, есть ли причина, по которой мне следует использовать вместо UIntPtr
?
3 ответа
Не похоже, чтобы для этого была веская причина. Из документов:
< Сильный > Заметки
...
Тип IntPtr совместим с CLS, а тип UIntPtr - нет. Только тип IntPtr используется в общем языковая среда . Тип UIntPtr - предоставлено в основном для обслуживания архитектурная симметрия с IntPtr тип.
Что ж, согласно Microsoft UIntPtr
предназначен в основном для архитектурной симметрии. Еще один интересный момент: UIntPtr
не соответствует требованиям CLS.
На первый взгляд может показаться, что предпочтительным вариантом является IntPtr. Однако, если вы знаете, что будете выполнять арифметические операции с указателями, то UIntPtr может быть лучшим выбором, так как, возможно, возникла какая-то неясная проблема, связанная с отрицательными значениями.
Существует большая разница .. Например, в 32-битном приложении новый UIntPtr(0xC01E0001)
приводит к указателю на 3223191553, но IntPtr(0xC01E0001)
приводит к System.OverflowException: "Арифметическая операция привела к переполнению. ". Это потому, что 0xC01E0001 больше, чем MaxValue для Int32.
Поэтому, если кому-то по-прежнему нужен такой указатель, в качестве внутреннего значения для IntPtr необходимо использовать отрицательное целое число, например
unchecked((IntPtr)(int)0xC01E0001)
Чтобы ответить на ваш вопрос: для значений больше Int32.MaxValue проще и чище использовать UIntPtr. Вероятно, это всегда лучшее решение, поскольку указатели всегда считаются беззнаковыми.
var p1 = new IntPtr(0xC01E0001); var p2 = (IntPtr)0xC01E0001;
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.
UIntPtr
. Можем ли мы назвать его самой бесполезной функцией.NET
?