Sobes.tech
Junior

Mi a különbség a C# osztályok és struktúrák között?

sobes.tech MI

Válasz az MI-től

Az osztályok referencia típusok, a struktúrák érték típusok.

  • Memória elhelyezkedése: Az osztálypéldányok a kezelt heap-en (Heap) helyezkednek el, a struktúrák a veremben (Stack) vagy az objektumon belül, amelyhez tartoznak.
  • Öröklődés: Az osztályok támogatják az öröklődést, a struktúrák nem. A struktúrák interfészeket valósíthatnak meg.
  • Alapértelmezett érték: Az osztályok esetében a null az alapértelmezett érték. A struktúrák esetében a mezők nullákból álló halmaza.
  • Átadás módszereknek: Az osztálypéldányokat referencia szerint adják át (referencia az objektumra). A struktúrákat érték szerint adják át (másolat készül).
  • Teljesítmény: A struktúrák gyorsabbak lehetnek az osztályoknál kis objektumok esetén, mivel elkerülik a heap kezelés és a szemétgyűjtés költségeit. Nagy struktúrák érték szerinti átadása azonban kevésbé hatékony lehet.
  • Létrehozás: A struktúrákhoz implicit paraméter nélküli konstruktor nullákkal inicializálja a mezőket. Az osztályokhoz explicit paraméter nélküli konstruktor szükséges, ha más konstruktorokat is definiáltak.
Jellemző Osztály (Class) Struktúra (Struct)
Típus Referencia típus Érték típus
Memória elhelyezése Kezelt heap Verem / Belső
Öröklődés Támogatja Nem támogatja (de interfészeket megvalósít)
Alapértelmezett érték null Nullák halmaza
Átadás Referencia szerint Érték szerint
Teljesítmény Lassabb lehet kis objektumoknál Gyorsabb lehet kis objektumoknál
Implicit konstruktor Nem (ha mások vannak) Igen (nullákkal inicializál)
// Osztály példája
public class PointClass
{
    public int X { get; set; }
    public int Y { get; set; }

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

// Struktúra példája
public struct PointStruct
{
    public int X { get; set; }
    public int Y { get; set; }

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

// Átadás bemutatása
public void ModifyPoint(PointClass pc, PointStruct ps)
{
    pc.X = 100; // Az eredeti PointClass módosul
    ps.X = 100; // Csak a PointStruct másolata módosul
}

// Használat
var pointClass1 = new PointClass(1, 2);
var pointStruct1 = new PointStruct(1, 2);

ModifyPoint(pointClass1, pointStruct1);

// pointClass1.X 100 lesz
// pointStruct1.X 1 lesz (mivel csak a másolat módosult)