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