Sobes.tech
Junior

Τι είναι οι δείκτες σε C#; Ποιοι τύποι δεικτών υπάρχουν και τους έχετε χρησιμοποιήσει στην πράξη;

sobes.tech AI

Απάντηση από AI

Οι δείκτες (indexers) στη C# επιτρέπουν την πρόσβαση σε ένα αντικείμενο κλάσης ή δομής όπως σε έναν πίνακα, χρησιμοποιώντας τη σύνταξη []. Δεν είναι στατικοί και υπερφορτώνουν τον τελεστή [].

Δείκτες

Οι δείκτες επιτρέπουν τον ορισμό λογικής πρόσβασης σε στοιχεία συλλογής ή δομής δεδομένων μέσα σε μια κλάση.

public class MyCollection
{
    private string[] data = new string[10];

    // Δείκτης που επιτρέπει την απόκτηση ή ρύθμιση ενός στοιχείου με βάση το δείκτη
    public string this[int index]
    {
        get
        {
            // Έλεγχος ορίων
            if (index >= 0 && index < data.Length)
            {
                return data[index];
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
        set
        {
            // Έλεγχος ορίων
            if (index >= 0 && index < data.Length)
            {
                data[index] = value;
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
    }
}

Τύποι παραμέτρων δείκτη

Οι δείκτες μπορούν να δέχονται οποιονδήποτε αριθμό παραμέτρων οποιουδήποτε τύπου, όχι μόνο ακέραιους.

public class DictionaryLike
{
    private Dictionary<string, string> _dictionary = new Dictionary<string, string>();

    // Δείκτης με παράμετρο τύπου string
    public string this[string key]
    {
        get
        {
            if (_dictionary.ContainsKey(key))
            {
                return _dictionary[key];
            }
            else
            {
                return null; // Ή ρίξτε εξαίρεση
            }
        }
        set
        {
            _dictionary[key] = value;
        }
    }
}

Υπερφόρτωση δείκτη

Μπορούν να δημιουργηθούν υπερφορτωμένοι δείκτες με διαφορετικές υπογραφές (σύνολα και τύποι παραμέτρων).

public class Matrix
{
    private int[,] data;

    public Matrix(int rows, int cols)
    {
        data = new int[rows, cols];
    }

    // Δείκτης με δύο ακέραιους παραμέτρους
    public int this[int row, int col]
    {
        get
        {
            // Έλεγχος ορίων
            if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
            {
                return data[row, col];
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
        set
        {
            // Έλεγχος ορίων
            if (row >= 0 && row < data.GetLength(0) && col >= 0 && col < data.GetLength(1))
            {
                data[row, col] = value;
            }
            else
            {
                throw new IndexOutOfRangeException();
            }
        }
    }
}

Εύρος (Ranges & Indices)

Στη C# 8.0 εισήχθησαν οι νέοι τύποι System.Index και System.Range, που επιτρέπουν τη χρήση σύνταξης για πρόσβαση σε στοιχεία από το τέλος της συλλογής (^) και για λήψη υπο-εύρους (..). Αυτές οι έννοιες συχνά αποκαλούνται "δείκτες", αλλά διαφέρουν από τους κλασικούς δείκτες.

using System;

public class ArrayExample
{
    public static void Main(string[] args)
    {
        string[] words = { "the", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog" };

        // Χρήση System.Index για πρόσβαση από το τέλος
        Index last = ^1; // δείκτης τελευταίου στοιχείου
        Console.WriteLine(words[last]); // dog

        // Χρήση System.Range για λήψη υπο-εύρους
        Range middle = 1..4; // στοιχεία από δείκτη 1 έως (αλλά όχι συμπεριλαμβανομένου) δείκτη 4
        string[] subset = words[middle]; // {"quick", "brown", "fox"}

        // Range με χρήση System.Index
        Range fromEnd = ^3..; // από το τρίτο από το τέλος μέχρι το τέλος
        string[] suffix = words[fromEnd]; // {"the", "lazy", "dog"}
    }
}

Πρακτική εφαρμογή

Χρησιμοποίησα ενεργά δείκτες κατά τη δημιουργία δικών μου συλλογών ή περιτυλίγματα πάνω σε υπάρχουσες συλλογές για πιο διαισθητική πρόσβαση στα δεδομένα. Για παράδειγμα:

  • Ανάπτυξη κλάσεων που αναπαριστούν μήτρες ή πολυδιάστατα δεδομένα, όπου η πρόσβαση με συντεταγμένες matrix[row, col] ήταν λογική.
  • Δημιουργία περιτυλιγμάτων πάνω σε Dictionary<> ή άλλες συλλογές, όπου η πρόσβαση μέσω κλειδιού με δείκτη βελτίωνε την αναγνωσιμότητα του κώδικα.
  • Σε απλές συλλογές, όπου απαιτείτο συντακτική άνεση πρόσβασης, παρόμοια με πίνακες.

Οι δείκτες εύρους (System.Index και System.Range) χρησιμοποιήθηκαν για πιο συνοπτική πρόσβαση σε τμήματα πινάκων ή λιστών, κάτι που είναι ιδιαίτερα χρήσιμο κατά την εργασία με υποσέλιδα ή μερικά δεδομένα από μια συλλογή.