Τι είναι οι δείκτες σε 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) χρησιμοποιήθηκαν για πιο συνοπτική πρόσβαση σε τμήματα πινάκων ή λιστών, κάτι που είναι ιδιαίτερα χρήσιμο κατά την εργασία με υποσέλιδα ή μερικά δεδομένα από μια συλλογή.