Sobes.tech
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