Τι κάνει το 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 κάθε στοιχείου
}
Κάθε Add και cast κάνει box/unbox → πολύ αργό για μεγάλο αριθμό στοιχείων.
Λύση: χρησιμοποιούμε List που είναι generic και δεν χρειάζεται boxing/unboxing.
List<int> list = new List<int>();
for (int i = 0; i < 100000; i++)
{
list.Add(i); // Καμία επιβάρυνση
}
Δύο λέξεις για το heap:
Δυναμική μνήμη
- Είναι η περιοχή της μνήμης όπου αποθηκεύονται αντικείμενα και reference types που δημιουργούνται runtime.
- Σε αντίθεση με το stack, η διαχείρισή της γίνεται από τον garbage collector.
30 Ερωτήσεις για .NET Senior Developer
nikosst
Top comments (0)