Sobes.tech
Junior

Kāda ir atšķirība starp klasēm un struktūrām C#?

sobes.tech AI

Atbilde no AI

Klases ir saistītie tipi ir atsauces tipi, struktūras - vērtību tipi.

  • Atmiņas izvietojums: Klases piemēri tiek izvietoti pārvaldāmā kaudzē (Heap), struktūras - stekā (Stack) vai objekta iekšpusē, kam tās pieder.
  • Mantošana: Klases atbalsta mantošanu, struktūras - nē. Struktūras var realizēt saskarnes.
  • Noklusējuma vērtība: Klases null ir noklusējuma vērtība. Struktūrām - nulles vērtību kopums.
  • Pārsūtīšana uz metodēm: Klases piemēri tiek pārsūtīti pēc atsauces (atsauce uz objektu). Struktūras - pēc vērtības (kopija).
  • Veiktspēja: Struktūras var būt ātrākas par klases mazākiem objektiem, jo izvairās no kaudzes pārvaldības un atkritumu savākšanas izmaksām. Tomēr, pārsūtot lielas struktūras pēc vērtības, tas var būt mazāk efektīvi.
  • Izveide: Struktūrām neizteikts konstruktors bez parametriem inicializē laukus ar nullēm.
Raksturlielums Klase (Class) Struktūra (Struct)
Tips Atsauces Vērtību
Izvietojums Pārvaldāma kaudze Steks / iebūvēts
Mantošana Atbalsta Neatbalsta (bet realizē saskarnes)
Noklusējuma vērtība null Nulles vērtību kopums
Pārsūtīšana Pēc atsauces Pēc vērtības
Veiktspēja Var būt lēnāka mazākiem objektiem Var būt ātrāka mazākiem objektiem
Neizteikts konstruktors Nē (ja ir citi) Jā (sākas ar nullēm)
// Piemērs klase
public class PointClass
{
    public int X { get; set; }
    public int Y { get; set; }

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

// Piemērs struktūra
public struct PointStruct
{
    public int X { get; set; }
    public int Y { get; set; }

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

// Demonstrācija pārsūtīšanas
public void ModifyPoint(PointClass pc, PointStruct ps)
{
    pc.X = 100; // Mainīs galveno PointClass
    ps.X = 100; // Mainīs tikai kopiju PointStruct
}

// Izmantošana
var pointClass1 = new PointClass(1, 2);
var pointStruct1 = new PointStruct(1, 2);

ModifyPoint(pointClass1, pointStruct1);

// pointClass1.X būs 100
// pointStruct1.X būs 1 (jo tikai kopija mainījās)