Sobes.tech
Junior

Na czym polega różnica między klasami a strukturami w C#?

sobes.tech AI

Odpowiedź od AI

Klasy to typy referencyjne, struktury to typy wartości.

  • Lokalizacja w pamięci: Instancje klas są umieszczane na zarządzanym stercie (Heap), struktury na stosie (Stack) lub wewnątrz obiektu, do którego należą.
  • Dziedziczenie: Klasy obsługują dziedziczenie, struktury nie. Struktury mogą implementować interfejsy.
  • Wartość domyślna: Dla klas null jest wartością domyślną. Dla struktur jest to zestaw zer dla pól.
  • Przekazywanie do metod: Instancje klas są przekazywane przez referencję (przekazywana jest referencja do obiektu). Struktury są przekazywane przez wartość (tworzona jest kopia).
  • Wydajność: Struktury mogą być szybsze od klas dla małych obiektów, ponieważ unika się kosztów zarządzania stertą i zbierania śmieci. Jednak przekazywanie dużych struktur przez wartość może być mniej wydajne.
  • Tworzenie: Dla struktur, domyślny konstruktor bez parametrów inicjuje pola zerami. Dla klas, jeśli zdefiniowano inne konstruktory, wymaga się jawnego konstruktora bez parametrów.
Cecha Klasa (Class) Struktura (Struct)
Typ Referencyjny Wartościowy
Lokalizacja w pamięci Zarządzany sterta Stos / Wbudowany
Dziedziczenie Obsługuje Nie obsługuje (ale implementuje interfejsy)
Wartość domyślna null Zestaw zer
Przekazywanie Przez referencję Przez wartość
Wydajność Może być wolniejsza dla małych obiektów Może być szybsza dla małych obiektów
Konstruktor domyślny Nie (jeśli są inne) Tak (inicjalizacja zerami)
// Przykład klasy
public class PointClass
{
    public int X { get; set; }
    public int Y { get; set; }

    public PointClass(int x, int y)
    {
        X = x;
        Y = y;
    }
}

// Przykład struktury
public struct PointStruct
{
    public int X { get; set; }
    public int Y { get; set; }

    public PointStruct(int x, int y)
    {
        X = x;
        Y = y;
    }
}

// Demonstracja przekazywania
public void ModifyPoint(PointClass pc, PointStruct ps)
{
    pc.X = 100; // Zmieni oryginalny PointClass
    ps.X = 100; // Zmieni tylko kopię PointStruct
}

// Użycie
var pointClass1 = new PointClass(1, 2);
var pointStruct1 = new PointStruct(1, 2);

ModifyPoint(pointClass1, pointStruct1);

// pointClass1.X będzie 100
// pointStruct1.X będzie 1 (ponieważ zmieniono tylko kopię)