.net - 这些 CIL 语句之间有什么区别?

标签 .net cil

在从相同的 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/

相关文章:

c# - 在 NetStandard 2.0 类库中使用 Newtonsoft 库

c# - 如何绘制格式化文本(如果不在 onRender 方法中)

c# - .Net 中的 Oracle 连接池

c# - 为什么C#不直接编译成机器码?

c# - C# 中的 `x is int?` 和 `x is int` 有区别吗?

c# - 在 .Net 中编译为 native 代码是否会完全删除 MSIL?

c# - .NET 外部 dll 引用检查

c# - 处理异步方法同步部分的异常

c# - c# 中的低质量编译器优化

c# - 显式基类型转换时可能冗余操作码