Sobes.tech
Junior

Qual è la differenza tra classi e strutture in C#?

sobes.tech AI

Risposta dell'AI

Le classi sono tipi di riferimento, le strutture sono tipi di valore.

  • Posizionamento in memoria: Le istanze di classi sono posizionate nell'heap gestito, le strutture nello stack o all'interno dell'oggetto a cui appartengono.
  • Ereditarietà: Le classi supportano l'ereditarietà, le strutture no. Le strutture possono implementare interfacce.
  • Valore di default: Per le classi, null è il valore di default. Per le strutture, un insieme di zeri per i campi.
  • Passaggio ai metodi: Le istanze di classi vengono passate per riferimento (si passa il riferimento all'oggetto). Le strutture vengono passate per valore (viene creata una copia).
  • Prestazioni: Le strutture possono essere più veloci delle classi per oggetti di piccole dimensioni, poiché evitano i costi di gestione dell'heap e di raccolta dei rifiuti. Tuttavia, passare strutture grandi per valore può essere meno efficiente.
  • Creazione: Per le strutture, un costruttore implicito senza parametri inizializza i campi a zero. Per le classi, è richiesto un costruttore esplicito senza parametri se sono definiti altri costruttori.
Caratteristica Classe (Class) Struttura (Struct)
Tipo Referenza Valore
Posizionamento in memoria Heap gestito Stack / Interno
Ereditarietà Supporta Non supporta (ma implementa interfacce)
Valore di default null Insieme di zeri
Passaggio Per riferimento Per valore
Prestazioni Può essere più lento per oggetti piccoli Può essere più veloce per oggetti piccoli
Costruttore implicito No (se ci sono altri) Sì (inizializzazione a zero)
// Esempio di classe
public class PointClass
{
    public int X { get; set; }
    public int Y { get; set; }

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

// Esempio di struttura
public struct PointStruct
{
    public int X { get; set; }
    public int Y { get; set; }

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

// Dimostrazione di passaggio
public void ModifyPoint(PointClass pc, PointStruct ps)
{
    pc.X = 100; // Modificherà il PointClass originale
    ps.X = 100; // Modificherà solo la copia di PointStruct
}

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

ModifyPoint(pointClass1, pointStruct1);

// pointClass1.X sarà 100
// pointStruct1.X sarà 1 (poiché solo la copia è stata modificata)