c# pointeurs vs IntPtr
c'est la 2ème partie de la 1ère question à l'aide de c# pointeurs
donc les pointeurs en c# sont "dangereux" et ne sont pas gérées par le garbage collector tout en un IntPtr est un objet géré. mais pourquoi utiliser des pointeurs alors? et lorsqu'il est possible d'utiliser les deux approches de façon interchangeable?
Gardez à l'esprit
IntPtr
est simplement un type de données primitif .NET qui est conçu pour contenir une adresse. Il est fondamentalement juste un int
qui est de 32 bits sur un ordinateur 32 bits et 64 bits sur une machine 64 bit. Rien sur IntPtr
lui-même est spécifique à des pointeurs.OriginalL'auteur Ali Tarhini | 2010-11-30
Vous devez vous connecter pour publier un commentaire.
La CLI distingue entre gérés et non gérés pointeurs. Géré pointeur est tapé, le type de la pointe-de la valeur est connue par le moteur d'exécution et uniquement de type-safe affectations sont autorisés. Non géré les pointeurs ne sont directement utilisables dans une langue qui les soutient, C++/CLI est le meilleur exemple.
L'équivalent d'un pointeur non géré dans le langage C# est
IntPtr
. Vous pouvez librement convertir un pointeur d'avant en arrière avec un cast. Aucun type de pointeur est associé avec elle, même si son nom sonne comme "pointeur sur int", c'est l'équivalent devoid*
en C/C++. L'utilisation d'un tel pointeur nécessite pinvoke, le Maréchal de classe ou d'un plâtre pour une gestion de type pointeur.Un peu de code pour jouer avec:
Notez comment le
unsafe
mot-clé ici est approprié. Vous pouvez appeler le Maréchal.WriteInt64() et que vous n'obtenez pas de plainte que ce soit. Il corrompt le cadre de la pile.IntPtr
. Un pointeur n'a pas à être tapé, il peut tout aussi bien être un pointeur non typé, c'est à dire unvoid*
. La differece est qu'unIntPtr
n'est pas un pointeur.OriginalL'auteur Hans Passant
Un
IntPtr
ne peut pas être utilisé comme un remplacement pour un pointeur.La
IntPtr
juste contient une valeur numérique, de sorte que vous ne pouvez pas l'utiliser pour accéder à toutes les données. D'où le nom; c'est une valeur entière avec la même taille comme un pointeur. Vous avez besoin pour transformer la valeur en un pointeur pour accéder aux données qu'il indique, il n'existe aucun moyen d'accéder aux données sans utiliser de code non sécurisé.Note également que
IntPtr
est une structure, n'est pas un objet, de sorte que le garbage collector n'est pas directement concerné.Tarhini: C'est tout simplement l'appel d'une méthode qui utilise le code unsafe pour vous. Le point est que le code unsafe doit être utilisé dans la fin, il n'y a aucun moyen d'accéder aux données autrement.
Pourquoi le downvote? Si vous n'expliquez pas ce que c'est que vous pensez est faux, il ne peut pas améliorer la réponse.
OriginalL'auteur Guffa
IntPtr
est un objet géré, mais l'objet qu'il désigne n'est pas encore nettoyée. À l'aide de dangereux pointeurs en C# est vraiment quelque chose que vous devriez éviter. Le Code à l'aide dangereux pointeurs peuvent ne pas tenir compte des différences dans les adresses mémoire entre les systèmes x86 et x64. Il vous permet de manipuler directement les adresses de la mémoire facilement, ce qui n'est pas le cas avec IntPtr que vous auriez besoin de maréchal entre le pointeur et la structure réelle stockée à cette adresse mémoire. À l'insécurité des pointeurs vous pourriez travailler directement avec le type sous-jacent: voici un post de blog j'ai écrit illustrant une utilisation possible de la contamination des pointeurs. Un autre exemple courant est manipuler les pixels de l'image directement.OriginalL'auteur Darin Dimitrov
Déréférencement des données pointé par un IntPtr est-ce simplement de coller le numéro de la IntPtr dans la barre d'adresse d'un dangereux ptr comme ci-dessous
OriginalL'auteur ste3e