Sobes.tech
Junior

Kuo skiriasi klasės ir struktūros C#?

sobes.tech AI

Atsakymas iš AI

Klasės yra nuorodų tipai, struktūros - reikšmės tipai.

  • Atminties išdėstymas: Klasės pavyzdžiai yra išdėstyti valdomame krūvoje (Heap), struktūros pavyzdžiai - stack'e (Stack) arba objekto viduje, kuriam priklauso.
  • Paveldėjimas: Klasės palaiko paveldėjimą, struktūros - ne. Struktūros gali įgyvendinti sąsajas.
  • Numatytoji reikšmė: Klasėms null yra numatytoji reikšmė. Struktūroms - nulinių laukų rinkinys.
  • Perdavimas į metodus: Klasės pavyzdžiai perduodami nuoroda (nuoroda į objektą). Struktūros - reikšme (kopija).
  • Veikimas: Struktūros gali būti greitesnės už klases mažiems objektams, nes išvengiama krūvos valdymo ir šiukšlių surinkimo išlaidų. Tačiau, didelių struktūrų perdavimas reikšme gali būti mažiau efektyvus.
  • Kūrimas: Struktūroms neapibrėžtas konstruktorius be parametrų inicijuoja laukus nuliais.
Bruožas Klasė (Class) Struktūra (Struct)
Tipas Nuorodinis Reikšminis
Išdėstymas Valdomas krūva Stack / Įmontuotas
Paveldėjimas Palaiko Ne palaiko (bet įgyvendina sąsajas)
Numatytoji reikšmė null Nulinė reikšmių rinkinys
Perdavimas Per nuorodą Per reikšmę
Veikimas Gali būti lėtesnis mažiems objektams Gali būti greitesnis mažiems objektams
Neapibrėžtas konstruktorius Ne (jei yra kitų) Taip (pradedama nuo nulio)
// Pavyzdys klasės
public class PointClass
{
    public int X { get; set; }
    public int Y { get; set; }

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

// Pavyzdys struktūros
public struct PointStruct
{
    public int X { get; set; }
    public int Y { get; set; }

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

// Pavyzdys perdavimo
public void ModifyPoint(PointClass pc, PointStruct ps)
{
    pc.X = 100; // Pakeis pagrindinį PointClass
    ps.X = 100; // Pakeis tik kopiją PointStruct
}

// Naudojimas
var pointClass1 = new PointClass(1, 2);
var pointStruct1 = new PointStruct(1, 2);

ModifyPoint(pointClass1, pointStruct1);

// pointClass1.X bus 100
// pointStruct1.X bus 1 (nes pakeista tik kopija)