Где узнать о VS отладчике "волшебные имена"

Если вы когда-либо использовали Reflector, вы, вероятно, заметили, что компилятор С# генерирует типы, методы, поля и локальные переменные, которые заслуживают "специального" отображения отладчиком. Например, локальные переменные, начинающиеся с "CS $", не отображаются пользователю. Существуют и другие специальные соглашения об именах для типов закрытия анонимных методов, резервные поля автоматических свойств и т.д.

Мой вопрос: где узнать об этих соглашениях об именах? Кто-нибудь знает о какой-либо документации?

Моя цель - заставить PostSharp 2.0 использовать те же соглашения.

Ответ 1

Это недокументированные детали реализации компилятора и могут быть изменены в любое время. (ОБНОВЛЕНИЕ: см. GeneratedNames.cs в источниках С# для текущих данных; приведенное ниже описание несколько устарело.)

Однако, поскольку я хороший парень, вот некоторые из этих деталей:

Если у вас есть неиспользуемая локальная переменная, которую удаляет оптимизатор, мы все равно отправляем отладочную информацию для него в PDB. Мы привязали суффикс __Deleted$ к таким переменным, чтобы отладчик знал, что они были в исходном коде, но не представлены в двоичном формате.

Временные слоты переменной, выделенные компилятором, задаются именами с шаблоном CS $X $Y, где X является "временным видом", а Y - количеством выделенных временных рядов. Временные виды:

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.  

Временные виды между 8 и 264 являются дополнительными хранилищами индексов массивов для многомерных массивов.

Временные виды выше 264 используются для временного использования фиксированного оператора, фиксирующего строку.

Сгенерированы специальные генерируемые компилятором имена:

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

Шаблон для создания магических имен: P<N>C__SI где:

  • P является CS $для кэшированных делегатов и отображает экземпляры классов, в противном случае пустые.
  • N - это оригинальное имя, связанное с вещью, если есть
  • C - символ от 1 до s, указанный выше
  • S - описательный суффикс ( "текущий", "состояние" и т.д.), так что вам не нужно запоминать таблицу при чтении метаданных.
  • Я - необязательный уникальный номер