Sobes.tech
Junior

Aký je rozdiel medzi triedami a štruktúrami v C#?

sobes.tech AI

Odpoveď od AI

Triedy sú referenčné typy, štruktúry sú hodnotové typy.

  • Umiestnenie v pamäti: Inštancie tried sa umiestňujú v spravovanej halde (Heap), inštancie štruktúr v zásobníku (Stack) alebo v rámci objektu, ktorému patria.
  • Dedičnosť: Triedy podporujú dedičnosť, štruktúry nie. Štruktúry môžu implementovať rozhrania.
  • Hodnota predvolená: Pre triedy je null predvolenou hodnotou. Pre štruktúry je to sada nulových hodnôt pre polia.
  • Prenos do metód: Inštancie tried sa prenášajú odkazom (odkaz na objekt). Inštancie štruktúr sa prenášajú hodnotou (vytvorí sa kópia).
  • Výkon: Štruktúry môžu byť rýchlejšie ako triedy pre malé objekty, pretože sa vyhýbajú nákladom na správu haldy a zber odpadu. Avšak, prenos veľkých štruktúr hodnotou môže byť menej efektívny.
  • Vytváranie: Pre štruktúry nepriame konštruktor bez parametrov inicializuje polia nulami. Pre triedy je potrebný priamejší konštruktor bez parametrov, ak sú definované iné konštruktory.
Prvok Trieda (Class) Štruktúra (Struct)
Typ Referenčný Hodnotový
Umiestnenie Spravovaná halda Zásobník / Vložené
Dedičnosť Podporuje Nepodporuje (ale implementuje rozhrania)
Predvolená hodnota null Nulová sada
Prenos Podľa odkazu Podľa hodnoty
Výkon Môže byť pomalší pre malé objekty Môže byť rýchlejší pre malé objekty
Nepriame konštruktor Nie (ak sú definované iné) Áno (inicializácia nulami)
// Príklad triedy
public class PointClass
{
    public int X { get; set; }
    public int Y { get; set; }

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

// Príklad štruktúry
public struct PointStruct
{
    public int X { get; set; }
    public int Y { get; set; }

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

// Demonštrácia prenosu
public void ModifyPoint(PointClass pc, PointStruct ps)
{
    pc.X = 100; // Zmení pôvodný PointClass
    ps.X = 100; // Zmení iba kópiu PointStruct
}

// Použitie
var pointClass1 = new PointClass(1, 2);
var pointStruct1 = new PointStruct(1, 2);

ModifyPoint(pointClass1, pointStruct1);

// pointClass1.X bude 100
// pointStruct1.X bude 1 (pretože sa zmenila iba kópia)