DEV Community

Record, Class και Struct στη C# — Αναλυτική Επεξήγηση με Παραδείγματα

🔹 Εισαγωγή

Στη C#, υπάρχουν τρεις βασικοί τρόποι για να ορίσεις τύπους δεδομένων (data types) που περιέχουν πεδία και μεθόδους:

  1. class
  2. struct
  3. 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" !!!

Enter fullscreen mode Exit fullscreen mode

➡️ Επειδή 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"

Enter fullscreen mode Exit fullscreen mode

➡️ Εδώ, 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)

Enter fullscreen mode Exit fullscreen mode

➡️ Αντίθετα με την 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)

Enter fullscreen mode Exit fullscreen mode

🔸 Record

var a = new PersonRecord("Nikos");
var b = new PersonRecord("Nikos");
Console.WriteLine(a == b); // True (ίδιες τιμές)

Enter fullscreen mode Exit fullscreen mode

🧱 Immutability (Αμεταβλητότητα)

public record PersonRecord
{
    public string Name { get; init; }  // init-only
}

Enter fullscreen mode Exit fullscreen mode
public record PersonRecord
{
    public string Name { get; init; }  // init-only
}

Enter fullscreen mode Exit fullscreen mode

📘 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)