Devriez-vous utiliser des pointeurs (code unsafe) en C#?
Devriez-vous utiliser des pointeurs dans votre code C#? Quels sont les avantages? Est-il recommandé par L'Homme (Microsoft)?
- L'utilisation des pointeurs est généralement liée à p/invoke. Voir cet article: c-sharpcorner.com/UploadFile/pcurnow/...
- Si vous êtes une utilisation intensive de code unsafe pour un usage spécifique, il peut aider à conserver l'intégralité de ce code dans un privé intérieur de la classe, contenue par une classe publique est sûr. Je n'aime pas l'idée d'avoir le reste de l'application de traiter avec des pointeurs. Toute obscure bugs qui viennent peuvent alors être attribués à cette paire de classes au lieu d'un lieu inconnu dans le reste de l'application. Il garde la complexité de fuites dans le reste de la base de code.
Vous devez vous connecter pour publier un commentaire.
De "L'Homme" lui-même:
L'utilisation des pointeurs est rarement nécessaire en C#, mais il y a certaines situations qui en ont besoin. À titre d'exemples, à l'aide d'un dangereux contexte pour permettre à des pointeurs est justifiée par les cas suivants:
L'utilisation de dangereux contexte dans d'autres situations est découragé.
Plus précisément, un dangereux contexte ne devrait pas être utilisé pour tenter d'écrire du code C en C#.
Attention:
Code écrit à l'aide d'un dangereux ne peuvent pas être vérifiés pour être en sécurité, de sorte qu'il sera exécuté uniquement lorsque le code est entièrement fiable. En d'autres termes, le code unsafe ne peut pas être exécuté dans un environnement non sécurisé. Par exemple, vous ne pouvez pas exécuter le code unsafe directement à partir de l'Internet.
Référence
Si vous avez à.
Dire que vous devez en fausses couleurs d'une grande image en niveaux de gris, dire 2000x2000 pixels. Premier à écrire le "sécuritaire" de la version à l'aide de
GetPixel()
etSetPixel()
. Si cela fonctionne, grand, aller de l'avant. si cela s'avère trop lent, vous devrez peut-être obtenir les bits qui composent l'image (oublier au sujet de la Couleur des matrices pour le bien de l'exemple). Il n'y a rien de "mauvais" sur l'utilisation de code non sécurisé, mais il ajoute à la complexité du projet et doit donc être utilisé uniquement lorsque cela est nécessaire.LockBits
seulement avant d'aller àunsafe
etLockBits
c'est à dire une étape intermédiaire.Je ne me souviens pas d'avoir jamais eu à le faire - mais je n'ai pas fait beaucoup d'interopérabilité. C'est l'application la plus commune, je crois: appel en code natif. Il y a très peu de fois où à l'aide de pointeurs permet d'optimiser un peu de code, mais c'est assez rare dans mon expérience.
Si c'est un guide, je me considère assez expérimenté en C# mais si je devais le faire tout le code unsafe, je serais obligé de consulter le spec/livres/MSDN pour me guider. Bien sûr, il y aura beaucoup de gens qui sont heureux avec le code unsafe mais moins familier avec (par exemple) les expressions de requête...
Je dirais que les principaux problèmes sont:-
Je suis sûr qu'il ya plus qui pourrait être ajouté à la liste; en général, comme les autres l'ont dit - éviter, sauf si vous avez.e.g. l'appel d'un non géré méthode via p/invoke qui nécessite un peu spécial pointeur funking. Même alors, le marshaller sera surtout éviter la nécessité pour elle, la plupart du temps.
'L'homme' dire aussi éviter, sauf si nécessaire, dans le fond.
Oh, joli article sur l'épinglage ici sur MSDN par la voie.
Le code Unsafe est entièrement pris en charge la fonction de l' .NET CLR. Les avantages sont la performance et la compatibilité avec le code binaire. Le runtime est un bac à sable qui vous empêche de s'écraser et de brûler, mais qui a un coût. Dans les situations où vous faites extrêmement intensive des opérations contre les grosses gouttes dans la mémoire, par exemple de manipulation de l'image, il est plus rapide d'une étape à l'extérieur de la normale de sécurité du runtime fournit.
Cela dit, je pense que plus gens d'ici n'dire "ne fais pas cela". La grande majorité des .NET développeurs ne fonctionnera pas dans un cas normal des activités qui ne peuvent être résolus à l'aide de code unsafe.
J'ai utilisé le code unsafe utiliser l'emprunt d'identité pour permettre aux services d'accès à des partages réseau. Ce n'est pas un problème si vous savez ce que vous faites.
Vous devez les utiliser si vous en avez besoin; surtout, cela sera lorsque vous traitez avec des problèmes d'interopérabilité des scénarios (par exemple, lorsque j'ai écrit un wrapper géré pour DPAPI dans .NET 1.0 elles sont nécessaires), mais très occasionnellement, il peut être pour améliorer les performances (après profilage!) en utilisant
stackalloc
ou similaire.Il est recommandé par Microsoft dans la mesure où ils sont les concepteurs de C#, et ils ont pris la décision d'ajouter la possibilité d'écrire
unsafe
du code. Vous pouvez le voir dans le choix du mot clé et de l'obligation de délimiter les méthodes/classes dans lesquelles vous l'écrire à l'aide du mot-clé, qu'il n'est pas conçu pour être le de facto la mise en œuvre de choix.Reinterpretive comme jette pas fourni par BitConverter.
Plus précisément la conversion d'un unint dans un int pour les fonctions de hachage où tout ce qui vous intéresse est le bits.
À l'aide de certains utiles, bien motivé sur c ou C++ idiomatiques fonctions sur les structures où vous avez besoin de les traiter comme un octet* d'une longueur connue, encore plus utile pour le hachage.
Extrêmement rapide de la sérialisation binaire de (très spécifique) dans la mémoire des structures (en procédant à un tableau d'entre eux), même si pour être honnête, il vaut mieux le faire par l'insertion de C++/CLI.
Il faut dire que, dans de nombreux cas, la tâche qui exige des pointeurs peuvent souvent être résolus de mieux en faisant en C++/CLI, puis de l'importer en vous projet c# comme un dll. Il ne change pas de savoir si le code est " sûr " ou pas, mais il fait un tas de fonctions utiles pour l'exploitation du pointeur en fonction des structures plus accessibles. Il vous permet également de déconner avec les types génériques ou les énumérations, si vous le voulez vraiment.
La probabilité de la plupart des développeurs qui ont besoin de faire c'est en effet à distance. Utile lorsque vous en avez besoin si...
sûr, il n'est pas "recommandé", c'est pourquoi il est marqué "dangereux". Mais ne vous laissez pas vous effrayer loin. Bien que, il devrait vous faire regarder à deux fois à votre code. Peut-être il est géré de façon de le faire?
en utilisant le code Unsafe est comme oublier le benenfits de la .Net Framework, j'ai utilisé une fois pour créé à l'ancienne structures comme des piles et des trucs, mais c'était seulement pour l'école, aujourd'hui, je n'ai pas eu besoin de les utiliser.
Le faire si elle rend votre code plus court et plus clair.
"Suivre vos penchants avec le respect dû à l'agent de police au coin de la rue." WSM