在哪里了解VSdebugging器的“魔术名字”

如果你曾经使用Reflector,你可能会注意到C#编译器生成的types,方法,字段和局部variables,应该由debugging器进行“特殊”显示。 例如,以“CS $”开头的本地variables不会显示给用户。 匿名方法的闭包types还有其他特殊的命名约定,自动属性的后台字段等等。

我的问题:在哪里了解这些命名约定? 有谁知道一些文件?

我的目标是使PostSharp 2.0使用相同的约定。

这些是编译器的未公开的实现细节,随时可能更改。 (更新:请参阅C#源代码中的GeneratedNames.cs以获取当前详细信息;下面的说明已经过时了。

但是,因为我是个好人,所以这里有一些细节:

如果你有一个优化器移除的未使用的局部variables,我们会发出debugging信息给PDB。 我们将后缀__Deleted$在这些variables上,以便debugging器知道它们在源代码中,但在二进制文件中没有表示。

由编译器分配的临时variables槽被命名为模式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之间的临时types是multidimensional array的附加数组索引存储。

临时types264以上用于涉及固定语句固定string的临时对象。

为以下内容生成特定的编译器生成名称:

 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其中:

  • 对于caching委托和显示类实例,P是CS $,否则为空。
  • N是与事物相关的原始名称,如果有的话
  • C是上面列出的字符1到s
  • S是一个描述性的后缀(“当前”,“状态”等等),这样当读取元数据时,不必将上面的表格存储起来。
  • 我是一个可选的唯一编号