DEV Community

Boxing και Unboxing

Τι κάνει το Boxing

Φαντάσου το int σαν ένα χαρτάκι με έναν αριθμό:

int x = 42; // Το χαρτάκι κρατάει τον αριθμό 42

Αυτό το χαρτάκι βρίσκεται στον stack, άρα είναι γρήγορο και μικρό.

Τώρα θέλουμε να το βάλουμε σε κουτί που δέχεται μόνο αντικείμενα, δηλαδή object:

object o = x; // Boxing

Το χαρτάκι τοποθετείται σε ένα κουτί (object) στο heap.

Το κουτί είναι reference type, δηλαδή δείχνει στο memory, δεν είναι απλώς το χαρτάκι.

Ουσιαστικά το int μετατρέπεται σε object για να χρησιμοποιηθεί σαν αναφορά.

Οπτική αναλογία:

Stack: x = 42

Boxing:
Heap: o ──► [42] (κουτί με το int μέσα)


Τι κάνει το Unboxing

Όταν θέλουμε να πάρουμε ξανά τον αριθμό από το κουτί:

int y = (int)o; // Unboxing

Ανοίγουμε το κουτί και ξαναβγάζουμε το χαρτάκι με τον αριθμό στο stack.

Οπτική:

Heap: o ──► [42] (κουτί)
Stack: y = 42 (πάλι value type)


Γιατί επηρεάζει την απόδοση

Boxing: δημιουργεί ένα νέο object στο heap → αργή λειτουργία, πιέζει τον garbage collector.

Unboxing: αντιγράφει τα δεδομένα πίσω στο stack, ελέγχοντας ταυτόχρονα τον τύπο → πρόσθετη επιβάρυνση.

Παράδειγμα επιβλαβούς χρήσης:

ArrayList list = new ArrayList();
for (int i = 0; i < 100000; i++)
{
    list.Add(i); // Boxing κάθε int
}

int sum = 0;
for (int i = 0; i < list.Count; i++)
{
    sum += (int)list[i]; // Unboxing κάθε στοιχείου
}
Enter fullscreen mode Exit fullscreen mode

Κάθε Add και cast κάνει box/unbox → πολύ αργό για μεγάλο αριθμό στοιχείων.

Λύση: χρησιμοποιούμε List που είναι generic και δεν χρειάζεται boxing/unboxing.

List<int> list = new List<int>();
for (int i = 0; i < 100000; i++)
{
    list.Add(i); // Καμία επιβάρυνση
}
Enter fullscreen mode Exit fullscreen mode

Δύο λέξεις για το heap:

Δυναμική μνήμη

  • Είναι η περιοχή της μνήμης όπου αποθηκεύονται αντικείμενα και reference types που δημιουργούνται runtime.
  • Σε αντίθεση με το stack, η διαχείρισή της γίνεται από τον garbage collector.

30 Ερωτήσεις για .NET Senior Developer


nikosst

Top comments (0)