Εφ'όσον είναι μέσα σε using, εκτελείται πρώτα το dispose και μετά επιστρέφει τιμή η συνάρτηση. Δες εδώ και το παραγόμενο IL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
.method public hidebysig static int32 DoIt() cil managed { // Code size 33 (0x21) .maxstack 2 .locals init ([0] class [System.Data]System.Data.SqlClient.SqlConnection myCon, [1] int32 x, [2] int32 CS$1$0000, [3] bool CS$4$0001) IL_0000: nop IL_0001: newobj instance void [System.Data]System.Data.SqlClient.SqlConnection::.ctor() IL_0006: stloc.0 .try { IL_0007: nop IL_0008: ldc.i4.0 IL_0009: stloc.1 IL_000a: ldloc.1 IL_000b: stloc.2 IL_000c: leave.s IL_001e } // end .try finally { IL_000e: ldloc.0 IL_000f: ldnull IL_0010: ceq IL_0012: stloc.3 IL_0013: ldloc.3 IL_0014: brtrue.s IL_001d IL_0016: ldloc.0 IL_0017: callvirt instance void [mscorlib]System.IDisposable::Dispose() IL_001c: nop IL_001d: endfinally } // end handler IL_001e: nop IL_001f: ldloc.2 IL_0020: ret } // end of method Program::DoIt |
Ο compiler βάζει όλο το using σε ένα try-catch-finally block, κάνει dispose στο finally, και κάνει return μετά το finally.
Dimitris-Ilias Gkanatsios
Developer Evangelist, Microsoft Hellas
My BlogStudentGuruTwitterFacebook