Junior
Τι είναι οι τύποι δεδομένων αναφοράς;
sobes.tech AI
Απάντηση από AI
Οι τύποι δεδομένων αναφοράς αποθηκεύουν όχι την ίδια την τιμή, αλλά μια αναφορά (διεύθυνση στη μνήμη) στον χώρο όπου βρίσκεται αυτή η τιμή.
Χαρακτηριστικά:
- Οι μεταβλητές τύπου αναφοράς μπορούν να αποθηκεύουν μια αναφορά σε
null. - Όταν μια μεταβλητή τύπου αναφοράς ανατίθεται σε μια άλλη, αντιγράφεται η αναφορά, όχι η τιμή. Και οι δύο δείχνουν στον ίδιο χώρο στη μνήμη.
- Οι αλλαγές που γίνονται μέσω μιας αναφοράς θα είναι ορατές και μέσω της άλλης, αν και οι δύο δείχνουν στο ίδιο αντικείμενο.
- Η μνήμη για αντικείμενα τύπου αναφοράς διαχειρίζεται ο garbage collector.
Παραδείγματα τύπων δεδομένων αναφοράς:
- Strings (
String) - Πίνακες
- Αντικείμενα προσαρμοσμένων κλάσεων
- Delegates (σε ορισμένες γλώσσες)
Διαφορές από τους τύπους δεδομένων τιμής:
| Χαρακτηριστικό | Τύποι δεδομένων τιμής | Τύποι δεδομένων αναφοράς |
|---|---|---|
| Αποθήκευση | Η τιμή από μόνη της | Μια αναφορά στην τιμή |
| Αντιγραφή | Αντιγράφεται η ίδια η τιμή | Αντιγράφεται η αναφορά |
| Τροποποίηση | Οι αλλαγές στην αντιγραφή δεν επηρεάζουν το αρχικό | Οι αλλαγές μέσω μιας αναφοράς είναι ορατές και στην άλλη (αν δείχνουν στο ίδιο αντικείμενο) |
| Μνήμη | Διαχειρίζεται από τη στοίβα (stack) | Διαχειρίζεται από το σωρό (heap), καθαρίζεται από τον garbage collector |
| Παραδείγματα | int, float, bool, struct (σε ορισμένες γλώσσες) |
String, Array, Object |
// Παράδειγμα σε C#
string s1 = "Hello"; // s1 αποθηκεύει μια αναφορά στη συμβολοσειρά "Hello"
string s2 = s1; // s2 τώρα αποθηκεύει την ίδια αναφορά με το s1
// Κατά την αλλαγή, δεν θα είναι ορατή μέσω της άλλης αναφοράς,
// επειδή οι συμβολοσειρές στο C# είναι αμετάβλητες.
// Όταν αλλάζει, δημιουργείται μια νέα συμβολοσειρά και η αναφορά επανακαθορίζεται.
s1 = "World";
Console.WriteLine(s2); // Εκτυπώνει "Hello"
int[] arr1 = { 1, 2, 3 }; // arr1 αποθηκεύει μια αναφορά στον πίνακα {1, 2, 3}
int[] arr2 = arr1; // arr2 αποθηκεύει την ίδια αναφορά
arr2[0] = 10; // Αλλαγή μέσω arr2
Console.WriteLine(arr1[0]); // Εκτυπώνει 10, η αλλαγή φαίνεται και μέσω arr1
// Παράδειγμα σε Java
String s1 = "Hello"; // s1 αποθηκεύει μια αναφορά στη συμβολοσειρά "Hello"
String s2 = s1; // s2 αποθηκεύει την ίδια αναφορά
// Οι συμβολοσειρές στο Java είναι αμετάβλητες.
// Όταν αλλάζει, δημιουργείται μια νέα συμβολοσειρά και η αναφορά επανακαθορίζεται.
s1 = "World";
System.out.println(s2); // Εκτυπώνει "Hello"
int[] arr1 = { 1, 2, 3 }; // arr1 αποθηκεύει μια αναφορά στον πίνακα {1, 2, 3}
int[] arr2 = arr1; // arr2 αποθηκεύει την ίδια αναφορά
arr2[0] = 10; // Αλλαγή μέσω arr2
System.out.println(arr1[0]); // Εκτυπώνει 10, η αλλαγή φαίνεται και μέσω arr1