🔹 Εισαγωγή
Στη C#, υπάρχουν τρεις βασικοί τρόποι για να ορίσεις τύπους δεδομένων (data types) που περιέχουν πεδία και μεθόδους:
- class
- struct
- record (προστέθηκε στη C# 9)
Αν και μοιάζουν συντακτικά, έχουν πολύ διαφορετική συμπεριφορά — κυρίως σε:
- Αναφορά (reference) vs Αντίγραφο (value)
- Αλλαγές (immutability)
- Equality (σύγκριση αντικειμένων)
- Σενάρια χρήσης
1. Class — Reference Type
🔹 Τι είναι
Η class είναι reference type.
Αυτό σημαίνει ότι:
- Οι μεταβλητές της κρατούν δείκτη (reference) σε αντικείμενο στη μνήμη heap.
- Αν αντιγράψεις μια class μεταβλητή, και οι δύο δείχνουν στο ίδιο αντικείμενο.
📘 Παράδειγμα
public class PersonClass
{
public string Name { get; set; }
}
var p1 = new PersonClass { Name = "Nikos" };
var p2 = p1; // <-- αντιγραφή reference
p2.Name = "Maria";
Console.WriteLine(p1.Name); // "Maria" !!!
➡️ Επειδή p1 και p2 δείχνουν στο ίδιο αντικείμενο, η αλλαγή επηρεάζει και τα δύο.
2. Struct — Value Type
🔹 Τι είναι
Η struct είναι value type.
Αυτό σημαίνει ότι:
- Αποθηκεύεται κατευθείαν στη στοίβα (stack) (ή inline μέσα σε άλλο object).
- Όταν την αντιγράφεις, δημιουργείται ανεξάρτητο αντίγραφο των δεδομένων.
📘 Παράδειγμα
public struct PersonStruct
{
public string Name { get; set; }
}
var s1 = new PersonStruct { Name = "Nikos" };
var s2 = s1; // <-- αντιγραφή τιμής (copy)
s2.Name = "Maria";
Console.WriteLine(s1.Name); // "Nikos"
➡️ Εδώ, s1 και s2 είναι δύο διαφορετικά αντίγραφα.
3. Record — Reference Type με Value Semantics
🔹 Τι είναι
Το record είναι reference type όπως η class,
αλλά συμπεριφέρεται σαν value type στη σύγκριση και στην ακεραιότητα των δεδομένων.
- Δηλαδή: ίδια αντικείμενα → θεωρούνται ίσα αν τα πεδία τους είναι ίσα.
- Επίσης, υποστηρίζει immutability (δηλαδή δεν αλλάζουν εύκολα μετά τη δημιουργία).
- Ιδανικό για data models, DTOs, CQRS commands, API responses.
📘 Παράδειγμα
public record PersonRecord(string Name);
var r1 = new PersonRecord("Nikos");
var r2 = new PersonRecord("Nikos");
Console.WriteLine(r1 == r2); // ✅ True (value equality)
➡️ Αντίθετα με την class, το record κάνει value equality — όχι reference equality.
Πώς δουλεύει η ισότητα (Equality)
🔸 Class
var a = new PersonClass { Name = "Nikos" };
var b = new PersonClass { Name = "Nikos" };
Console.WriteLine(a == b); // False (διαφορετικά references)
🔸 Record
var a = new PersonRecord("Nikos");
var b = new PersonRecord("Nikos");
Console.WriteLine(a == b); // True (ίδιες τιμές)
🧱 Immutability (Αμεταβλητότητα)
public record PersonRecord
{
public string Name { get; init; } // init-only
}
public record PersonRecord
{
public string Name { get; init; } // init-only
}
📘 with expression = δημιουργεί νέο αντικείμενο βασισμένο στο παλιό.
✨ Συμπέρασμα
- Χρησιμοποίησε class για αντικείμενα με συμπεριφορά, dependency injection, inheritance.
- Χρησιμοποίησε struct για απλά, μικρά data containers με performance ανάγκες.
- Χρησιμοποίησε record για data models, DTOs, messages, commands — εκεί που μετράνε οι τιμές και όχι τα references.
Πηγή Microsoft : [https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals/object-oriented/?utm_source=chatgpt.com]
Top comments (0)