时间:2011-09-07 14:01:12

标签: .net cil

在从相同的C#代码(但可能是不同的编译器版本)生成的两个程序集上运行ILDASM之后,我从每个相应的dll获得以下输出。

.locals init (class MyClass/'<>c__DisplayClass3' V_0)

.locals init ([0] class MyClass/'<>c__DisplayClass3' 'CS$<>8__locals4')

这两个陈述之间有什么区别,具体来说,'[0]'符号的意义是什么?

2 个答案:

答案 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类型的变量以及您提及的代码行?