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