在从相同的 C# 代码(但可能是不同的编译器版本)生成的两个程序集上运行 ILDASM 后,我从每个相应的 dll 中得到以下输出。
.locals init (class MyClass/'<>c__DisplayClass3' V_0)
和
.locals init ([0] class MyClass/'<>c__DisplayClass3' 'CS$<>8__locals4')
这两个陈述有什么区别,具体来说
'[0]'
的意义是什么?象征?
最佳答案
这两个语句在功能上是相同的。差异是由 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
关于.net - 这些 CIL 语句之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7335164/