'using' 阻止编译器生成的代码在 dotPeek 或 ILSpy 中不可见
'using' block compiler generated code not visible in dotPeek or ILSpy
我有兴趣查看编译器为生成 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 块生成了什么样的代码。
一个简单的示例重现:
免费JustDecompile tool from Telerik可以显示详情
基本上(Test
是实施 IDisposable
的示例 class),编译版本:
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();
}
}
我有兴趣查看编译器为生成 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 块生成了什么样的代码。
一个简单的示例重现:
免费JustDecompile tool from Telerik可以显示详情
基本上(Test
是实施 IDisposable
的示例 class),编译版本:
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();
}
}