Lire cette question aujourd'hui sur les codes sûrs et non sûrs, j'ai ensuite lu un article à ce sujet dans MSDN mais je ne comprends toujours pas. Pourquoi vouloir utiliser des pointeurs en C# ? Est-ce uniquement pour des raisons de rapidité ?
Réponses
Trop de publicités?Vous aurez parfois besoin de pointeurs pour interfacer votre C# avec le système d'exploitation sous-jacent ou d'autres codes natifs. Il est fortement déconseillé de le faire, car ce n'est pas "sûr" (natch).
Il y aura de très rares occasions où vos performances seront tellement limitées par le CPU que vous aurez besoin de ce minuscule supplément de performance. Je recommanderais d'écrire ces éléments importants pour le processeur dans un module séparé en assembleur ou en C/C++, d'exporter une API et de demander à votre code .NET d'appeler cette API. Un avantage supplémentaire possible est que vous pouvez mettre du code spécifique à la plate-forme dans le module non géré, et laisser la plate-forme .NET agnostique.
J'ai tendance à l'éviter, mais il arrive qu'elle soit très utile :
- pour les performances lors de l'utilisation de tampons bruts (graphiques, etc.)
- nécessaire pour certaines API non gérées (également assez rare pour moi)
- pour tricher avec les données
Par exemple, je maintiens un code de sérialisation. En écrivant un float
à un flux sans avoir à utiliser BitConverter.GetBytes
(qui crée un tableau à chaque fois) est pénible - mais je peux tricher :
float f = ...;
int i = *(int*)&f;
Je peux maintenant utiliser la touche shift ( >>
) etc pour écrire i
beaucoup plus facilement que l'écriture f
serait (les octets seront identiques à ceux que j'aurais appelés si j'avais appelé BitConverter.GetBytes
De plus, je contrôle maintenant l'endianness par la façon dont je choisis d'utiliser shift).
Il existe au moins une API .Net gérée qui rend souvent l'utilisation de pointeurs inévitable. Voir Chaîne sécurisée y Marshal.SecureStringToGlobalAllocUnicode .
En seulement pour obtenir la valeur en texte clair d'un SecureString
est d'utiliser l'un des Marshal
pour le copier dans une mémoire non gérée.