Junior
Care este diferența dintre clase și structuri în C#?
sobes.tech AI
Răspuns de la AI
Clasele sunt tipuri de referință, structurile sunt tipuri de valoare.
- Localizarea în memorie: Instanțele de clasă sunt plasate în heap-ul gestionat (Heap), structurile în stivă (Stack) sau în interiorul obiectului căruia îi aparțin.
- Moștenire: Clasele suportă moștenirea, structurile nu. Structurile pot implementa interfețe.
- Valoare implicită: Pentru clase,
nulleste valoarea implicită. Pentru structuri, un set de zerouri pentru câmpuri. - Transmiterea către metode: Instanțele de clasă sunt transmise prin referință (se transmite referința la obiect). Structurile sunt transmise prin valoare (se creează o copie).
- Performanță: Structurile pot fi mai rapide decât clasele pentru obiecte mici, deoarece evită costurile de gestionare a heap-ului și colectare a gunoiului. Cu toate acestea, transmiterea structurilor mari prin valoare poate fi mai puțin eficientă.
- Creare: Pentru structuri, un constructor implicit fără parametri inițializează câmpurile cu zerouri. Pentru clase, este necesar un constructor explicit fără parametri dacă sunt definite alți constructori.
| Caracteristică | Clasă (Class) | Structură (Struct) |
|---|---|---|
| Tip | Referință | Valoare |
| Localizare în memorie | Heap gestionat | Stivă / Intern |
| Moștenire | Suportă | Nu suportă (dar implementează interfețe) |
| Valoare implicită | null |
Set de zerouri |
| Transmitere | Prin referință | Prin valoare |
| Performanță | Poate fi mai lentă pentru obiecte mici | Poate fi mai rapidă pentru obiecte mici |
| Constructor implicit | Nu (dacă există altele) | Da (inițializare cu zerouri) |
// Exemplu de clasă
public class PointClass
{
public int X { get; set; }
public int Y { get; set; }
public PointClass(int x, int y)
{
X = x;
Y = y;
}
}
// Exemplu de structură
public struct PointStruct
{
public int X { get; set; }
public int Y { get; set; }
public PointStruct(int x, int y)
{
X = x;
Y = y;
}
}
// Demonstrație de transmitere
public void ModifyPoint(PointClass pc, PointStruct ps)
{
pc.X = 100; // Va modifica PointClass-ul original
ps.X = 100; // Va modifica doar copia de PointStruct
}
// Utilizare
var pointClass1 = new PointClass(1, 2);
var pointStruct1 = new PointStruct(1, 2);
ModifyPoint(pointClass1, pointStruct1);
// pointClass1.X va fi 100
// pointStruct1.X va fi 1 (deoarece doar copia a fost modificată)