Dies sind undokumentierte Implementierungsdetails des Compilers, die jederzeit geändert werden können. (UPDATE: GeneratedNames.cs
Die aktuellen Details finden Sie in den C # -Quellen. Die folgende Beschreibung ist etwas veraltet.)
Da ich jedoch ein netter Kerl bin, sind hier einige dieser Details:
Wenn Sie eine nicht verwendete lokale Variable haben, die der Optimierer entfernt, geben wir trotzdem Debug-Informationen dafür in den PDB aus. Wir haben das Suffix __Deleted$
auf solche Variablen geklebt , damit der Debugger weiß, dass sie im Quellcode enthalten, aber nicht in der Binärdatei dargestellt sind.
Vom Compiler zugewiesene temporäre Variablen-Slots erhalten Namen mit dem Muster CS $ X $ Y, wobei X die "temporäre Art" und Y die Anzahl der bisher zugewiesenen temporären Slots ist. Die vorübergehenden Arten sind:
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.
Temporäre Arten zwischen 8 und 264 sind zusätzliche Array-Indexspeicher für mehrdimensionale Arrays.
Temporäre Arten über 264 werden für temporäre Arten verwendet, bei denen die feste Anweisung eine Zeichenfolge fixiert.
Spezielle vom Compiler generierte Namen werden generiert für:
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")
Das Muster zum Generieren magischer Namen lautet: P<N>C__SI
wo:
- P ist CS $ für zwischengespeicherte Delegaten und Anzeigeklasseninstanzen, ansonsten leer.
- N ist der ursprüngliche Name, der mit der Sache verbunden ist, falls vorhanden
- C ist das oben aufgeführte Zeichen 1 bis s
- S ist ein beschreibendes Suffix ("aktuell", "Status" usw.), damit Sie sich beim Lesen der Metadaten nicht die obige Tabelle merken müssen.
- Ich bin eine optionale eindeutige Nummer