2015-10-28 86 views
0

我有興趣查看using代碼塊的編譯器生成代碼,它生成try-finally,但我沒有看到dotPeekILSpy顯示此詳細信息。我使用ildasm.exe來看看這個代碼塊,我發現它有try-finally塊,但不能很好地理解它......所以想看看這兩個工具是否會有所幫助。'使用'block編譯器生成的代碼在dotPeek或ILSpy中不可見

任何想法?

更新: 所以我最近使用它實現了IDisposable在我的項目,很擔心如果using代碼塊和結構與IDisposable的會導致拳擊結構...但我後來發現其中提到了下面的文章編譯器會針對這種情況進行優化,並且在嘗試調用Dispose時不會進行填充。

http://ericlippert.com/2011/03/14/to-box-or-not-to-box/

所以我很好奇,想看看它的編譯器爲我用塊什麼樣的代碼。

一個簡單的例子攝製: enter image description here

+2

張貼一些示例反編譯的代碼! –

+1

ILSpy(我也猜測dotPeek)會識別編譯器生成的'using'語句擴展並將其反轉回'using'語句。 –

+0

如果你想知道IL,請看[這裏](http://weblogs.asp.net/kennykerr/introduction-to-msil-part-5-exception-handling)。一個MSIL指令將沿'.try L_000b到L_001d最後處理程序L_001d到L_0027'的行生成,同時還有一個類似'leave.s L_0027'的指令。 –

回答

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(); 
    } 
} 
+0

我懷疑他可能在談論MSIL代碼。 –

+0

爲什麼'test'輸出到'IDisposable'?我們可以在不投射的情況下調用'test.Dispose()'。 –

+0

@MatiasCicero請參閱'備註'https://msdn.microsoft.com/en-us/library/yh598w02.aspx – sab669