Sobes.tech
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, null este 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ă)