Sobes.tech
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 null vý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)