Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Μια διευκρίνηση για το using statement

Îåêßíçóå áðü ôï ìÝëïò DeClen. Τελευταία δημοσίευση από το μέλος DeClen στις 17-09-2007, 12:23. Υπάρχουν 2 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  17-09-2007, 12:05 35064

    Μια διευκρίνηση για το using statement

    Παιδιά καλημέρα,

    Θέλω μια διευκρίνηση για τη χρήση του using statement. Ρίξτε μια ματιά στα παρακάτω κομματάκι κώδικα...

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public static int DoIt()
    {
    using (SqlConnection myCon = new SqlConnection(...))
    {

    int x = 0;

    // do something and return x
    //...

    return x;

    }

    }

    Στον παραπάνω κώδικα ελευθερώνονται τα unmanaged resources? Θέλω να πω ότι αφού εκτελεστεί το return γίνεται dispose το sql connection ή η εκτέλεση δεν φτάνει το "κλείσιμο" του using;
  •  17-09-2007, 12:10 35065 σε απάντηση της 35064

    Απ: Μια διευκρίνηση για το using statement

    Εφ'όσον είναι μέσα σε 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 Blog
    StudentGuru
    Twitter
    Facebook
  •  17-09-2007, 12:23 35066 σε απάντηση της 35065

    Απ: Μια διευκρίνηση για το using statement

    Πράγματι dt008 έχεις δίκιο.

    Σε ευχαριστώ για την απάντηση. Smile

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems