Une interprétation directe
Un site IntPtr est un entier qui a la même taille qu'un pointeur .
Vous pouvez utiliser IntPtr pour stocker une valeur de pointeur dans un type non pointeur. Cette fonctionnalité est importante dans .NET, car l'utilisation de pointeurs est très sujette aux erreurs et donc illégale dans la plupart des contextes. En permettant à la valeur du pointeur d'être stockée dans un type de données "sûr", la plomberie entre non sécurisé Les segments de code peuvent être mis en œuvre dans un code de haut niveau plus sûr, voire dans un langage .NET qui ne prend pas directement en charge les pointeurs.
La taille de IntPtr est spécifique à la plate-forme, mais ce détail a rarement besoin d'être pris en compte, puisque le système utilisera automatiquement la taille correcte.
Le nom "IntPtr" prête à confusion -- quelque chose comme Handle
aurait pu être plus approprié. Ma supposition initiale était que "IntPtr" était un pointeur à un nombre entier. Le site Documentation MSDN de IntPtr entre dans des détails quelque peu énigmatiques, sans jamais donner d'indications sur la signification du nom.
Une autre perspective
Un site IntPtr
est un pointeur avec deux limitations :
- Il ne peut pas être déréférencé directement
- Il ne connaît pas le type des données vers lesquelles il pointe.
En d'autres termes, un IntPtr
est comme un void*
-- mais avec la caractéristique supplémentaire qu'il peut (mais ne devrait pas) être utilisé pour l'arithmétique de base des pointeurs.
Afin de déréférencer un IntPtr
vous pouvez soit le convertir en un pointeur vrai (une opération qui ne peut être effectuée que dans des contextes "non sécurisés"), soit le passer à une routine d'aide telle que celles fournies par la méthode d'aide à la résolution des problèmes. InteropServices.Marshal
classe. En utilisant le Marshal
donne l'illusion de la sécurité puisqu'elle ne nécessite pas d'être dans un contexte explicite "non sûr". Cependant, elle ne supprime pas le risque de plantage qui est inhérent à l'utilisation de pointeurs.