Junior
Ποια είναι η διαφορά μεταξύ κλάσεων και δομών σε C#;
sobes.tech AI
Απάντηση από AI
Οι κλάσεις είναι τύποι αναφοράς, οι δομές είναι τύποι τιμής.
- Τοποθέτηση στη μνήμη: Τα αντικείμενα κλάσεων τοποθετούνται στη διαχειριζόμενη στοίβα (Heap), οι δομές στη στοίβα (Stack) ή μέσα στο αντικείμενο στο οποίο ανήκουν.
- Κληρονομικότητα: Οι κλάσεις υποστηρίζουν κληρονομικότητα, οι δομές όχι. Οι δομές μπορούν να υλοποιούν διεπαφές.
- Τιμή προεπιλογής: Για τις κλάσεις, το
nullείναι η προεπιλεγμένη τιμή. Για τις δομές, ένα σύνολο μηδενικών για τα πεδία. - Μεταβίβαση σε μεθόδους: Τα αντικείμενα κλάσεων περνούνται με αναφορά (περνάει η αναφορά στο αντικείμενο). Οι δομές περνούνται με τιμή (δημιουργείται ένα αντίγραφο).
- Απόδοση: Οι δομές μπορεί να είναι ταχύτερες από τις κλάσεις για μικρά αντικείμενα, καθώς αποφεύγονται τα έξοδα διαχείρισης heap και συλλογής απορριμμάτων. Ωστόσο, η μεταβίβαση μεγάλων δομών με τιμή μπορεί να είναι λιγότερο αποδοτική.
- Δημιουργία: Για τις δομές, ένας αυθαίρετος κατασκευαστής χωρίς παραμέτρους αρχικοποιεί τα πεδία με μηδενικά. Για τις κλάσεις, απαιτείται ρητός κατασκευαστής χωρίς παραμέτρους αν ορίζονται άλλοι κατασκευαστές.
| Χαρακτηριστικό | Κλάση (Class) | Δομή (Struct) |
|---|---|---|
| Τύπος | Αναφορά | Τιμή |
| Τοποθέτηση στη μνήμη | Διαχειριζόμενο heap | Στοίβα / Εσωτερική |
| Κληρονομικότητα | Υποστηρίζει | Δεν υποστηρίζει (αλλά υλοποιεί διεπαφές) |
| Τιμή προεπιλογής | null |
Σύνολο μηδενικών |
| Μεταβίβαση | Με αναφορά | Με τιμή |
| Απόδοση | Μπορεί να είναι πιο αργή για μικρά αντικείμενα | Μπορεί να είναι πιο γρήγορη για μικρά αντικείμενα |
| Αυθαίρετος κατασκευαστής | Όχι (αν υπάρχουν άλλοι) | Ναι (αρχικοποίηση με μηδενικά) |
// Παράδειγμα κλάσης
public class PointClass
{
public int X { get; set; }
public int Y { get; set; }
public PointClass(int x, int y)
{
X = x;
Y = y;
}
}
// Παράδειγμα δομής
public struct PointStruct
{
public int X { get; set; }
public int Y { get; set; }
public PointStruct(int x, int y)
{
X = x;
Y = y;
}
}
// Δείγμα μεταβίβασης
public void ModifyPoint(PointClass pc, PointStruct ps)
{
pc.X = 100; // Θα αλλάξει το αρχικό PointClass
ps.X = 100; // Θα αλλάξει μόνο το αντίγραφο του PointStruct
}
// Χρήση
var pointClass1 = new PointClass(1, 2);
var pointStruct1 = new PointStruct(1, 2);
ModifyPoint(pointClass1, pointStruct1);
// pointClass1.X θα είναι 100
// pointStruct1.X θα είναι 1 (επειδή άλλαξε μόνο το αντίγραφο)