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)