DEV Community

Span και Memory

Span<Τ>

  • Είναι μια δομή (struct) που αντιπροσωπεύει ένα συνεχές τμήμα μνήμης.
  • Μπορεί να δείχνει σε πίνακες, strings ή stack allocated δεδομένα χωρίς να δημιουργεί νέο αντίγραφο.

Χαρακτηριστικά:

  • Stack-only: Υπάρχει μόνο στο stack. Δεν μπορεί να κρατηθεί στο heap.
  • Γρήγορη: Επειδή δεν δημιουργεί αντίγραφα, είναι πολύ γρήγορη για operations σε buffers.
  • Μη-ασφαλής (unsafe) αλλά προστατευμένη: Παρέχει ασφάλεια τύπων και bounds checking.

Φαντάσου ότι έχεις έναν πίνακα με αριθμούς:

int[] numbers = { 1, 2, 3, 4, 5 };

Enter fullscreen mode Exit fullscreen mode
  • Αυτός ο πίνακας βρίσκεται στη μνήμη (στο heap).
  • Τώρα θέλουμε να δουλέψουμε μόνο με τα πρώτα 3 στοιχεία, χωρίς να φτιάξουμε νέο πίνακα.

Εδώ μπαίνει το Span:

Span<int> firstThree = numbers.AsSpan(0, 3);

Enter fullscreen mode Exit fullscreen mode
  • Το firstThree δεν είναι νέος πίνακας.
  • Είναι σαν δανειζόμαστε ένα παράθυρο πάνω στον πίνακα numbers.
  • Οποιαδήποτε αλλαγή κάνουμε στο firstThree, αλλάζει και τον πίνακα numbers.
firstThree[0] = 10;
Console.WriteLine(numbers[0]); // Εκτυπώνει 10

Enter fullscreen mode Exit fullscreen mode

Με άλλα λόγια:

Το Span είναι σαν ένα παράθυρο ή δείκτης πάνω σε υπάρχουσα μνήμη.

Δεν δημιουργεί νέο αντίγραφο → είναι πολύ γρήγορο.

Μπορεί να δείχνει σε πίνακες, strings ή buffers.


Πώς μοιάζει οπτικά

numbers array: [ 1 | 2 | 3 | 4 | 5 ]
Span window:  [ 1 | 2 | 3 ]

Enter fullscreen mode Exit fullscreen mode

Το 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;

Enter fullscreen mode Exit fullscreen mode

Πότε το χρησιμοποιούμε:

  • Όταν χρειαζόμαστε αποθήκευση στο 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)