猿问

哪里可以了解VS调试器'魔术名'

哪里可以了解VS调试器'魔术名'

如果您曾经使用过Reflector,您可能会注意到C#编译器会生成类型,方法,字段和局部变量,这些变量值得调试器“特殊”显示。例如,以“CS $”开头的局部变量不会显示给用户。匿名方法的闭包类型,自动属性的后备字段等还有其他特殊的命名约定。

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

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


摇曳的蔷薇
浏览 447回答 1
1回答

尚方宝剑之说

这些是编译器的未记录的实现细节,并且可能随时更改。(更新:请参阅GeneratedNames.cs&nbsp;C#来源了解当前的详细信息;以下描述有些过时。)但是,既然我是一个好人,这里有一些细节:如果您有一个优化程序删除的未使用的局部变量,我们会将调试信息发送到PDB中。我们将后缀粘贴__Deleted$到这些变量上,以便调试器知道它们是源代码但不在二进制文件中表示。由编译器分配的临时变量槽的名称为CS $ X $ Y,其中X是“临时类型”,Y是到目前为止分配的临时数。临时种类是:0&nbsp;-->&nbsp;short&nbsp;lived&nbsp;temporaries1&nbsp;-->&nbsp;return&nbsp;value&nbsp;temporaries2&nbsp;-->&nbsp;temporaries&nbsp;generated&nbsp;for&nbsp;lock&nbsp;statements3&nbsp;-->&nbsp;temporaries&nbsp;generated&nbsp;for&nbsp;using&nbsp;statements4&nbsp;-->&nbsp;durable&nbsp;temporaries5&nbsp;-->&nbsp;the&nbsp;result&nbsp;of&nbsp;get&nbsp;enumerator&nbsp;in&nbsp;a&nbsp;foreach6&nbsp;-->&nbsp;the&nbsp;array&nbsp;storage&nbsp;in&nbsp;a&nbsp;foreach7&nbsp;-->&nbsp;the&nbsp;array&nbsp;index&nbsp;storage&nbsp;in&nbsp;a&nbsp;foreach.8到264之间的临时类型是多维数组的附加数组索引存储。264以上的临时种类用于涉及修复字符串的固定语句的临时种类。为以下内容生成特殊编译器生成的名称:1&nbsp;-->&nbsp;the&nbsp;iterator&nbsp;state&nbsp;("state")2&nbsp;-->&nbsp;the&nbsp;value&nbsp;of&nbsp;current&nbsp;in&nbsp;an&nbsp;iterator&nbsp;("current")3&nbsp;-->&nbsp;a&nbsp;saved&nbsp;parameter&nbsp;in&nbsp;an&nbsp;iterator4&nbsp;-->&nbsp;a&nbsp;hoisted&nbsp;'this'&nbsp;in&nbsp;an&nbsp;iterator&nbsp;("this")5&nbsp;-->&nbsp;a&nbsp;hoisted&nbsp;local&nbsp;in&nbsp;an&nbsp;iterator6&nbsp;-->&nbsp;the&nbsp;hoisted&nbsp;locals&nbsp;from&nbsp;an&nbsp;outer&nbsp;scope7&nbsp;-->&nbsp;a&nbsp;hoisted&nbsp;wrapped&nbsp;value&nbsp;("wrap")8&nbsp;-->&nbsp;the&nbsp;closure&nbsp;class&nbsp;instance&nbsp;("locals")9&nbsp;-->&nbsp;the&nbsp;cached&nbsp;delegate&nbsp;instance&nbsp;("CachedAnonymousMethodDelegate")a&nbsp;-->&nbsp;the&nbsp;iterator&nbsp;instance&nbsp;("iterator")b&nbsp;-->&nbsp;an&nbsp;anonymous&nbsp;method c&nbsp;-->&nbsp;anonymous&nbsp;method&nbsp;closure&nbsp;class&nbsp;("DisplayClass")d&nbsp;-->&nbsp;iterator&nbsp;classe&nbsp;-->&nbsp;fixed&nbsp;buffer&nbsp;struct&nbsp;("FixedBuffer")f&nbsp;-->&nbsp;anonymous&nbsp;type&nbsp;("AnonymousType")g&nbsp;-->&nbsp;initializer&nbsp;local&nbsp;("initLocal")h&nbsp;-->&nbsp;query&nbsp;expression&nbsp;temporary&nbsp;("TransparentIdentifier")i&nbsp;-->&nbsp;anonymous&nbsp;type&nbsp;field&nbsp;("Field")j&nbsp;-->&nbsp;anonymous&nbsp;type&nbsp;type&nbsp;parameter&nbsp;("TPar")k&nbsp;-->&nbsp;auto&nbsp;prop&nbsp;field&nbsp;("BackingField")l&nbsp;-->&nbsp;iterator&nbsp;thread&nbsp;id m&nbsp;-->&nbsp;iterator&nbsp;finally&nbsp;("Finally")n&nbsp;-->&nbsp;fabricated&nbsp;method&nbsp;("FabricatedMethod")o&nbsp;-->&nbsp;dynamic&nbsp;container&nbsp;class&nbsp;("SiteContainer")p&nbsp;-->&nbsp;dynamic&nbsp;call&nbsp;site&nbsp;("Site")q&nbsp;-->&nbsp;dynamic&nbsp;delegate&nbsp;("SiteDelegate")r&nbsp;-->&nbsp;com&nbsp;ref&nbsp;call&nbsp;local&nbsp;("ComRefCallLocal")s&nbsp;-->&nbsp;lock&nbsp;taken&nbsp;local&nbsp;("LockTaken")生成魔法名称的模式是:P<N>C__SI其中:对于缓存的委托和显示类实例,P是CS $,否则为空。N是与该事物相关联的原始名称(如果有)C是上面列出的字符1到sS是描述性后缀(“当前”,“状态”等),因此您在阅读元数据时不必记住上面的表。我是一个可选的唯一号码
随时随地看视频慕课网APP
我要回答