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