在从相同的C#代码(但可能是不同的编译器版本)生成的两个程序集上运行ILDASM之后,我从每个相应的dll获得以下输出。
.locals init (class MyClass/'<>c__DisplayClass3' V_0)
和
.locals init ([0] class MyClass/'<>c__DisplayClass3' 'CS$<>8__locals4')
这两个陈述之间有什么区别,具体来说,'[0]'
符号的意义是什么?
答案 0 :(得分:4)
这两个陈述在功能上是相同的。差异是由ILDASM在第二种情况下使用来自.pdb的数据引起的。当调试信息可用时,ILDASM包含变量名称和索引;否则它给它们通用名称并省略索引。
我只能推测包含该索引是为了帮助您将任何ldloc.x
指令与其变量名相关联。
另外,在手动编辑MSIL时,明确提供变量索引可能很有用,因为它可能会阻止您在添加或删除本地时出错:
.locals init ([0] int32 x,
[1] int32 y,
[2] int32 z)
ldloc.1 //load y
如果您稍后删除了x
而没有查看您的方法并修复索引:
.locals init ([1] int32 y, //error -- Undefined type of local var slot 0 in method frob
[2] int32 z)
ldloc.1 //oops, would have loaded z
答案 1 :(得分:1)
它被称为插槽索引。该索引可用于引用适当的变量(与名称的引用/访问相同)。在第一个示例中,instanve将由V_0
名称访问,其次是0
索引。
[0]
- 广告位索引class MyClass/'<>c__DisplayClass3'
- 变量类型'CS$<>8__locals4'
- 变量名称您是否已声明多个MyClass
类型的变量以及您提及的代码行?