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