Sobes.tech
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 (επειδή άλλαξε μόνο το αντίγραφο)