Span<Τ>
- Είναι μια δομή (struct) που αντιπροσωπεύει ένα συνεχές τμήμα μνήμης.
- Μπορεί να δείχνει σε πίνακες, strings ή stack allocated δεδομένα χωρίς να δημιουργεί νέο αντίγραφο.
Χαρακτηριστικά:
- Stack-only: Υπάρχει μόνο στο stack. Δεν μπορεί να κρατηθεί στο heap.
- Γρήγορη: Επειδή δεν δημιουργεί αντίγραφα, είναι πολύ γρήγορη για operations σε buffers.
- Μη-ασφαλής (unsafe) αλλά προστατευμένη: Παρέχει ασφάλεια τύπων και bounds checking.
Φαντάσου ότι έχεις έναν πίνακα με αριθμούς:
int[] numbers = { 1, 2, 3, 4, 5 };
- Αυτός ο πίνακας βρίσκεται στη μνήμη (στο heap).
- Τώρα θέλουμε να δουλέψουμε μόνο με τα πρώτα 3 στοιχεία, χωρίς να φτιάξουμε νέο πίνακα.
Εδώ μπαίνει το Span:
Span<int> firstThree = numbers.AsSpan(0, 3);
- Το firstThree δεν είναι νέος πίνακας.
- Είναι σαν δανειζόμαστε ένα παράθυρο πάνω στον πίνακα numbers.
- Οποιαδήποτε αλλαγή κάνουμε στο firstThree, αλλάζει και τον πίνακα numbers.
firstThree[0] = 10;
Console.WriteLine(numbers[0]); // Εκτυπώνει 10
Με άλλα λόγια:
Το Span είναι σαν ένα παράθυρο ή δείκτης πάνω σε υπάρχουσα μνήμη.
Δεν δημιουργεί νέο αντίγραφο → είναι πολύ γρήγορο.
Μπορεί να δείχνει σε πίνακες, strings ή buffers.
Πώς μοιάζει οπτικά
numbers array: [ 1 | 2 | 3 | 4 | 5 ]
Span window: [ 1 | 2 | 3 ]
Το Span δείχνει μόνο τα πρώτα 3 στοιχεία.
Δεν έχει δική του μνήμη. Απλά βλέπει μέρος της υπάρχουσας.
Κριτήριο για χρήση
Θέλεις να επεξεργαστείς μερικά στοιχεία ενός πίνακα ή buffer γρήγορα, χωρίς αντιγραφές.
Πολύ χρήσιμο για parsing, επεξεργασία strings ή bytes.
Memory
- Είναι μια δομή που μπορεί να ζει στο heap.
- Παρόμοιο με Span, αλλά μπορεί να αποθηκευτεί και να περάσει ανάμεσα σε async μεθόδους.
Χαρακτηριστικά:
- Μπορεί να μεταφερθεί στο heap, σε αντίθεση με το Span.
- Μπορεί να μετατραπεί σε Span όταν χρειάζεται πρόσβαση.
Παράδειγμα χρήσης:
int[] numbers = { 1, 2, 3, 4, 5 };
Memory<int> memoryNumbers = numbers.AsMemory(); // Memory δείχνει στον πίνακα
Span<int> spanNumbers = memoryNumbers.Span; // Μετατροπή σε Span για επεξεργασία
spanNumbers[1] = 20;
Πότε το χρησιμοποιούμε:
- Όταν χρειαζόμαστε αποθήκευση στο heap ή να περάσουμε δεδομένα σε async μεθόδους.
- Για μεγάλους buffers που θέλουμε να επεξεργαστούμε κομμάτι-κομμάτι.
Σύγκριση Span vs Memory
| Feature | Span | Memory |
|---|---|---|
| Stack/Heap | Stack only | Heap or stack |
| Async Methods | Not allowed | Allowed |
| Overhead | Πολύ χαμηλό | Ελαφρώς υψηλότερο |
| Conversion | — |
.Span to Span |
- Χρησιμοποιείς Span για γρήγορες, προσωρινές επεξεργασίες στο stack.
- Χρησιμοποιείς Memory όταν χρειάζεσαι ανθεκτικότητα πέρα από το stack ή async operations.
https://dev.to/__b63657/30-eroteseis-gia-net-senior-developer-2kk5
Top comments (0)