我有兴趣查看生成using
的{{1}}代码块的编译器生成代码,但我没有看到显示此详细信息的try-finally
和dotPeek
。我使用ILSpy
来查看此代码块,我发现它中有ildasm.exe
块但无法理解它...所以想看看这两个工具是否有用。
有什么想法吗?
更新:
所以我最近在我的项目中使用了一个实现了IDisposable的结构,并担心try-finally
代码块和带有IDisposable的结构会导致装箱...但后来我发现下面的文章提到编译器针对这种情况进行了优化并且在尝试调用Dispose时不会显示框。
http://ericlippert.com/2011/03/14/to-box-or-not-to-box/
所以我很想知道编译器为我的using块生成了什么样的代码。
答案 0 :(得分:1)
免费JustDecompile tool from Telerik可以显示详细信息。
基本上(Test
是实现IDisposable
的示例类),编译版本:
internal class Program
{
private static void Main(string[] args)
{
using (var test = new Test())
{
test.Foo();
}
Console.ReadLine();
}
}
被反编译为:
internal class Program
{
public Program()
{
}
private static void Main(string[] args)
{
Test test = new Test();
try
{
test.Foo();
}
finally
{
if (test != null)
{
((IDisposable)test).Dispose();
}
}
Console.ReadLine();
}
}