Зачем использовать IntPtr для управления? - PullRequest
10 голосов
/ 07 февраля 2012

При использовании PInvoke я заметил, что нам нужно использовать IntPtr для ссылки на дескрипторы Windows.Мне интересно, почему бы просто не использовать int для ручки?Мое понимание дескриптора состоит в том, что это просто целочисленное значение.

Ответы [ 4 ]

18 голосов
/ 07 февраля 2012

Дескриптор окна определяется как целое число собственного размера указателя машины . Это так, что они могут тайно быть указателем, если они должны быть. (Дескриптор, вероятно, не является указателем , но разрешено быть единым, если разработчики операционной системы сочтут это необходимым. Обычно они не являются указателями по соображениям безопасности; это делает его людям слишком легко злоупотреблять системой, если они на самом деле являются указателями.)

Int в C # определяется как 32-разрядное целое число, которое будет слишком маленьким на 64-разрядной машине. IntPtr определяется как целое число, которое может содержать указатель размера машины. Вот почему вы всегда используете IntPtr при взаимодействии с дескрипторами.

10 голосов
/ 07 февраля 2012

Дескрипторы имеют значение размером с указатель .

Они имеют ширину 8 байт на 64-разрядных платформах.

4 голосов
/ 07 февраля 2012

Размер дескриптора зависит от архитектуры машины (32/64 бит).IntPtr позаботится об этом.

2 голосов
/ 07 февраля 2012

Дескриптор по сути является указателем системного уровня, и указатель неявным образом не приводится к типу int.Это тип сам по себе.Вот почему у вас есть IntPtr в .NET для представления типа Handle.

...