ProgrammazioneSviluppatore VB.NET, Architetto

Descrivi le caratteristiche e l'uso corretto delle strutture (Structure) in Visual Basic rispetto alle classi (Class). Quali limitazioni esistono nel loro utilizzo e in cosa si differenziano dalle classi in termini di gestione della memoria e comportamento?

Supera i colloqui con l'assistente IA Hintsage

Risposta

In Visual Basic, le strutture sono definite utilizzando la parola chiave Structure. Esse:

  • Sono tipi valore (value type): vengono allocate nello stack oppure all'interno di altri oggetti;
  • Non supportano l'ereditarietà da altri tipi personalizzati (ma possono implementare interfacce);
  • Non possono avere un costruttore senza parametri, ad eccezione del costruttore predefinito al di fuori del corpo della struttura;
  • Non possono essere dichiarate come MustInherit (astratte) né contenere finalizzatori;
  • Sono una buona scelta per oggetti piccoli e immutabili, risparmiando memoria nell'heap.

Esempio

Public Structure Point Public X As Integer Public Y As Integer Public Sub New(x As Integer, y As Integer) Me.X = x Me.Y = y End Sub End Structure Dim p1 As New Point(1, 2) Dim p2 = p1 ' Viene copiato il valore, non il riferimento! p2.X = 5 ' p1.X = 1, p2.X = 5

Limitazioni

  • Le strutture non possono ereditare l'una dall'altra, solo da System.ValueType.
  • Solo costruttore automatico senza parametri.
  • Sono consentite solo interfacce da implementare.
  • Se la struttura contiene membri di riferimento, è consigliabile prestare attenzione a causa delle possibili complicazioni nella copia e mutazione.

Domanda subliminale

D: Come si comporta la struttura quando viene passata a una funzione ByVal e ByRef? Qual è la differenza rispetto al passaggio di una classe?

R: Quando si passa una struttura ByVal, viene creata una copia dell'intera struttura. Le modifiche nella funzione non influenzano l'originale. Quando si usa ByRef, viene modificata la variabile originale. A differenza delle classi, che in qualsiasi passaggio (anche ByVal) passano un riferimento, le strutture vengono copiate completamente in ByVal, il che influisce sulle prestazioni e sul comportamento.

Sub MutateByVal(p As Point) p.X = 100 End Sub Sub MutateByRef(ByRef p As Point) p.X = 100 End Sub Dim s As New Point(3, 4) MutateByVal(s) ' s.X è ancora 3 MutateByRef(s) ' s.X è ora 100

Storia

1. In un grande progetto di biblioteca, le strutture venivano utilizzate per passare grandi array di dati tramite interfacce ByVal. Questo portava a una riduzione delle prestazioni a causa della copia ripetuta di grandi strutture nello stack. Il problema è stato risolto sostituendo le strutture con classi immutabili.


Storia

2. In un progetto di sviluppo GIS, si è creata confusione durante la copia di strutture contenenti campi di riferimento: modificando un array all'interno della struttura, lo sviluppatore non si aspettava che l'originale cambiasse ovunque fosse stato copiato l'array, nonostante fosse un “tipo valore”.


Storia

3. Nel software di contabilità, si mescolavano strutture con classi per entità aziendali: un tentativo di implementare l'ereditarietà per una struttura ha generato un errore di compilazione, costringendo a riorganizzare l'architettura del sistema, il che si è rivelato dispendioso a causa della scelta inizialmente errata tra strutture e classi.