Junior
V čem spočívá rozdíl mezi třídami a strukturami v C#?
sobes.tech AI
Odpověď od AI
Třídy jsou referenční typy, struktury jsou hodnotové typy.
- Umístění v paměti: Instance tříd jsou umístěny na spravovaném haldě (Heap), struktury na zásobníku (Stack) nebo uvnitř objektu, kterému patří.
- Dědičnost: Třídy podporují dědičnost, struktury nikoliv. Struktury mohou implementovat rozhraní.
- Výchozí hodnota: Pro třídy je
nullvýchozí hodnota. Pro struktury je to sada nul pro pole. - Předání do metod: Instance tříd jsou předávány odkazem (předává se odkaz na objekt). Struktury jsou předávány hodnotou (kopie).
- Výkon: Struktury mohou být rychlejší než třídy pro malé objekty, protože se vyhýbají nákladům na správu haldy a sběr odpadu. Předání velkých struktur hodnotou však může být méně efektivní.
- Vytvoření: Pro struktury inicializuje neparametrický konstruktor pole nulami. Pro třídy je vyžadován explicitní bezparametrický konstruktor, pokud jsou definovány jiné konstruktory.
| Vlastnost | Třída (Class) | Struktura (Struct) |
|---|---|---|
| Typ | Referenční typ | Hodnotový typ |
| Umístění v paměti | Spravovaná halda | Zásobník / Vnitřní |
| Dědičnost | Podporuje | Nepodporuje (ale implementuje rozhraní) |
| Výchozí hodnota | null |
Sada nul |
| Předání | Odkazem | Hodnotou |
| Výkon | Může být pomalejší pro malé objekty | Může být rychlejší pro malé objekty |
| Implicitní konstruktor | Ne (pokud jsou jiné) | Ano (inicializace nulami) |
// Příklad třídy
public class PointClass
{
public int X { get; set; }
public int Y { get; set; }
public PointClass(int x, int y)
{
X = x;
Y = y;
}
}
// Příklad struktury
public struct PointStruct
{
public int X { get; set; }
public int Y { get; set; }
public PointStruct(int x, int y)
{
X = x;
Y = y;
}
}
// Demonstrace předání
public void ModifyPoint(PointClass pc, PointStruct ps)
{
pc.X = 100; // Změní původní PointClass
ps.X = 100; // Změní pouze kopii PointStruct
}
// Použití
var pointClass1 = new PointClass(1, 2);
var pointStruct1 = new PointStruct(1, 2);
ModifyPoint(pointClass1, pointStruct1);
// pointClass1.X bude 100
// pointStruct1.X bude 1 (protože změněna byla pouze kopie)