Gdzie dowiedzieć się o vs debugger'magiczne nazwy'

Jeśli kiedykolwiek używałeś Reflector, prawdopodobnie zauważyłeś, że kompilator C# generuje typy, metody, pola i zmienne lokalne, które zasługują na 'specjalne' wyświetlanie przez debugger. Na przykład zmienne lokalne zaczynające się od 'CS$' nie są wyświetlane użytkownikowi. Istnieją inne specjalne konwencje nazewnictwa dla typów zamykania anonimowych metod, pól pomocniczych właściwości automatycznych i tak dalej.

Moje pytanie: gdzie poznać te konwencje nazewnictwa? Czy ktoś wie o jakiejś dokumentacji?

Moim celem jest, aby PostSharp 2.0 używał tych samych konwencji.

Author: svick, 2010-03-24

1 answers

Są to nieudokumentowane szczegóły implementacji kompilatora i mogą ulec zmianie w dowolnym momencie. (Aktualizacja: Zobacz GeneratedNames.cs w C# źródła dla bieżących szczegółów; opis poniżej jest nieco Nieaktualny.)

Jednak, ponieważ jestem miłym facetem, oto niektóre z tych szczegółów:

Jeśli masz nieużywaną zmienną lokalną, którą usuwa optymalizator, i tak wysyłamy informacje o debugowaniu do PDB. Przykleiliśmy sufiks __Deleted$ do takich zmiennych, aby debugger wiedział że były w kodzie źródłowym, ale nie reprezentowane w binarnym.

Tymczasowe sloty zmiennych przydzielane przez kompilator otrzymują nazwy ze wzorem CS$X$Y, gdzie X jest "rodzajem tymczasowym", A Y jest liczbą tymczasowych przydzielonych do tej pory. Rodzaje tymczasowe to:

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.  

Typy tymczasowe od 8 do 264 są dodatkowymi magazynami indeksów tablic dla tablic wielowymiarowych.

Rodzaje tymczasowe powyżej 264 są używane dla czasowników obejmujących stałe wyrażenie ustalające a sznurek.

Specjalne nazwy generowane przez kompilator są generowane dla:

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

Wzór do generowania magicznych nazw to: P<N>C__SI Gdzie:

  • p jest CS$ dla buforowanych delegatów I instancji klasy display, w przeciwnym razie puste.
  • N jest oryginalną nazwą związaną z rzeczą, jeśli w ogóle
  • C to znak od 1 do s wymieniony powyżej
  • S jest przyrostkiem opisowym ("current"," state " itd.), dzięki czemu nie musisz pamiętać powyższej tabeli, gdy odczytywanie metadanych.
  • I jest opcjonalnym unikalnym numerem
 211
Author: Eric Lippert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-26 12:34:07