【发布时间】:2015-10-28 13:01:05
【问题描述】:
我有兴趣查看生成try-finally 的using 代码块的编译器生成代码,但我没有看到dotPeek 和ILSpy 都显示了这个细节。我用ildasm.exe 来查看这个代码块,我发现它里面有try-finally 块,但不能很好地理解它......所以想看看这两个工具是否有帮助。
有什么想法吗?
更新:
所以我最近在我的项目中使用了一个实现 IDisposable 的结构,并担心 using 代码块和带有 IDisposable 的结构会导致装箱......但后来我发现下面的文章提到编译器针对这种情况进行了优化并且确实尝试调用 Dispose 时不框。
http://ericlippert.com/2011/03/14/to-box-or-not-to-box/
所以我很想知道编译器会为我的 using 块生成什么样的代码。
【问题讨论】:
-
贴一些示例反编译代码!
-
ILSpy(我猜也是 dotPeek)将识别编译器生成的
using语句扩展并将其反转回using语句。 -
如果您想了解 IL,请参阅 here。一条 MSIL 指令将沿着
.try L_000b to L_001d finally handler L_001d to L_0027的行生成,以及一条类似leave.s L_0027的指令。 -
更新了更多信息。
-
在 ILSpy 中选择 IL 作为语言,然后它将显示原始 IL,因此没有任何内容被隐藏。