104 votes

Où en savoir plus sur les 'noms magiques' du débogueur VS

Si vous avez déjà utilisé un Réflecteur, vous avez probablement remarqué que le compilateur C# génère des types, des méthodes, des champs et des variables locales qui méritent d'être "spécial" de l'affichage par le débogueur. Par exemple, les variables locales en commençant par " CS$' ne sont pas affichées à l'utilisateur. Il existe d'autres conventions de nommage pour la fermeture des types de méthodes anonymes, champs de sauvegarde automatique des propriétés, et ainsi de suite.

Ma question: où apprendre au sujet de ces conventions de nommage? Personne ne sait à propos de la documentation?

Mon objectif est de faire de PostSharp 2.0 utilisent les mêmes conventions.

202voto

Eric Lippert Points 300275

Ce sont des sans-papiers, les détails de l'implémentation du compilateur, et sujettes à modification à tout moment.

Cependant, depuis que je suis un mec sympa, voici quelques uns de ces détails:

Si vous avez un solde non utilisé de variable locale que l'optimiseur supprime, nous émettons les informations de débogage pour cela de toute façon dans la PDB. Nous avons collé le suffixe __Deleted$ sur ces variables, afin que le débogueur sait qu'ils étaient dans le code source mais qui ne figurent pas dans le fichier binaire.

Variable temporaire slots alloués par le compilateur sont donné des noms avec le modèle CS$X$Y, où X est le temporaire "genre" et Y est le nombre de temporaires alloués à ce jour. Le temporaire types sont:

0 --> short lived temporaries
1 --> return value temporaries
2 --> temporaries generated for lock statements
3 --> temporaries generated for using statements
4 --> durable temporaries
5 --> the result of get enumerator in a foreach
6 --> the array storage in a foreach
7 --> the array index storage in a foreach.  

Temporaire sortes entre 8 et 264 supplémentaires index de tableau de stockages pour les tableaux multidimensionnels.

Temporaire sortes 264 ci-dessus sont utilisés pour les temporaires impliquant la fixe à la déclaration de la fixation d'une chaîne de caractères.

Spécial généré par le compilateur noms sont générés pour:

1 --> the iterator state ("state")
2 --> the value of current in an iterator ("current")
3 --> a saved parameter in an iterator
4 --> a hoisted 'this' in an iterator ("this")
5 --> a hoisted local in an iterator
6 --> the hoisted locals from an outer scope
7 --> a hoisted wrapped value ("wrap")
8 --> the closure class instance ("locals")
9 --> the cached delegate instance ("CachedAnonymousMethodDelegate")
a --> the iterator instance ("iterator")
b --> an anonymous method
c --> anonymous method closure class ("DisplayClass")
d --> iterator class
e --> fixed buffer struct ("FixedBuffer")
f --> anonymous type ("AnonymousType")
g --> initializer local ("initLocal")
h --> query expression temporary ("TransparentIdentifier")
i --> anonymous type field ("Field")
j --> anonymous type type parameter ("TPar")
k --> auto prop field ("BackingField")
l --> iterator thread id
m --> iterator finally ("Finally")
n --> fabricated method ("FabricatedMethod")
o --> dynamic container class ("SiteContainer")
p --> dynamic call site ("Site")
q --> dynamic delegate ("SiteDelegate")
r --> com ref call local ("ComRefCallLocal")
s --> lock taken local ("LockTaken")

Le modèle pour générer des noms magiques est: P<N>C__SI où:

  • P CS$ pour la mise en cache des délégués et l'affichage des instances de classe vide dans le cas contraire.
  • N est le nom d'origine associée à la chose, si tout
  • C est le caractère de 1 à s énumérées ci-dessus
  • S est un descriptif de suffixe ("actuel", "état", et ainsi de suite), de sorte que vous n'avez pas à avoir le tableau ci-dessus mémorisé lors de la lecture des métadonnées.
  • Je est une option de numéro unique

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