11 votes

Code sûr ou code dangereux

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é ?

25voto

Cat Man Do Points 11771

Il y a trois raisons d'utiliser un code non sécurisé :

  • API (comme indiqué par John)
  • Obtenir l'adresse mémoire réelle des données (par exemple, accéder au matériel en mémoire)
  • Moyen le plus efficace d'accéder aux données et de les modifier (exigences en matière de performances en fonction du temps)

5voto

John Källén Points 3680

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.

4voto

Marc Gravell Points 482669

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).

0voto

Olly Points 2982

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X