2015-10-28 5 views
0

Je suis intéressé à regarder le code généré par le compilateur pour le bloc de code using qui génère try-finally, mais je ne vois pas les deux dotPeek et ILSpy montrant ce détail. J'ai utilisé ildasm.exe pour regarder ce bloc de code et je vois qu'il a le bloc try-finally dedans mais ne peut pas le comprendre bien ... donc a voulu voir si ces 2 outils aideraient.« utilisant » compilateur bloc code généré non visible dans dotPeek ou ILSpy

Des idées?

MISE À JOUR: Je récemment utilisé une struct qui a mis en œuvre IDisposable dans mon projet et était inquiet si le bloc de code using et struct avec IDisposable provoqueraient la boxe ... mais j'ai trouvé plus tard l'article suivant qui a mentionné que la Le compilateur optimise pour cette situation et ne tape pas lorsque vous essayez d'appeler Dispose.

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

J'étais curieux de voir quel genre de code ne le compilateur génère pour mon bloc à l'aide.

Un exemple simple repro: enter image description here

+2

Poster quelques exemples code décompilé! –

+1

ILSpy (et je devine dotPeek également) reconnaîtra le compilateur a généré l'expansion de l'instruction 'using 'et l'inversera dans une instruction' using'. –

+0

Si vous vous interrogez sur l'IL, voir [ici] (http://weblogs.asp.net/kennykerr/introduction-to-msil-part-5-exception-handling). Une instruction MSIL sera générée le long des lignes '.try L_000b à L_001d enfin le gestionnaire L_001d à L_0027' avec une instruction quelque part comme' leave.s L_0027'. –

Répondre

1

Le JustDecompile tool from Telerik libre est en mesure de montrer les détails.

Fondamentalement (Test étant un exemple de classe mise en œuvre IDisposable), la version compilée:

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     using (var test = new Test()) 
     { 
      test.Foo(); 
     } 

     Console.ReadLine(); 
    } 
} 

est décompilé à:

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

Je soupçonne qu'il pourrait parler du code MSIL. –

+0

Une raison pour laquelle 'test' est casté en' IDisposable'? On peut juste appeler 'test.Dispose()' sans lancer. –

+0

@MatiasCicero voir 'Remarques' https://msdn.microsoft.com/en-us/library/yh598w02.aspx – sab669