ProgrammazioneSviluppatore VB/VB.NET

Come implementare tipi di dati definiti dall'utente (User-Defined Types, UDT) in Visual Basic e quando usarli anziché le classi?

Supera i colloqui con l'assistente IA Hintsage

Risposta

In Visual Basic, i tipi di dati definiti dall'utente (Type in VB6 o Structure in VB.NET) consentono di definire i propri tipi compositi che comprendono più variabili di diversi tipi. Questo è utile per raggruppare dati correlati.

UDTs (VB6):

Type Person Name As String Age As Integer Height As Single End Type Dim employee As Person employee.Name = "Alexey" employee.Age = 32 employee.Height = 1.85

Structures (VB.NET):

Structure Person Public Name As String Public Age As Integer Public Height As Single End Structure Dim employee As Person employee.Name = "Alexey"

Quando usare:

  • Per contenitori di dati leggeri senza logica
  • Quando le prestazioni sono importanti (le strutture vengono create nello stack)
  • Se non è necessario il funzionalità di ereditarietà — le strutture non supportano l'ereditarietà.

Al contrario: Le classi vengono utilizzate quando è necessaria l'incapsulazione della logica, l'ereditarietà, il polimorfismo o l'implementazione di interfacce.

Domanda trabocchetto

Perché alle strutture in VB.NET non possono essere assegnati valori Nothing?

Risposta: Solo alle variabili di classe (oggetti) può essere assegnato Nothing, poiché esse memorizzano riferimenti. Le strutture sono un tipo value, contengono sempre un insieme di valori; tentare di assegnare Nothing genera un errore di compilazione.

Dim s As Person = Nothing 'Errore! Le strutture non possono essere Nothing (tranne Nullable(Of T))

Esempi di errori reali dovuti alla mancanza di conoscenza delle sfumature dell'argomento


Storia

In un vecchio progetto si è deciso di sostituire un array di primitivi con una struttura con più campi, ma il nuovo codice è diventato inaspettatamente più lento. Si è scoperto che la struttura era molto grande e veniva copiata frequentemente nelle funzioni. Se fosse stata utilizzata una classe, sarebbero state copiate solo le referenze e non l'intera struttura.


Storia

Dopo il porting da VB6-UDT a VB.NET, uno degli sviluppatori non ha implementato l'interfaccia ISerializable per la struttura nella chiamata remota. Di conseguenza, l'oggetto remoto non poteva essere serializzato, causando errori nelle interazioni interprocesso.


Storia

In un modulo per la gestione della geometria, la struttura memorizzava riferimenti a array (mutable). Molteplici istanze di questa struttura portavano a effetti inaspettati, poiché all'interno della struttura i riferimenti puntavano agli stessi array di dati — le mutazioni si riflettevano su tutte le copie!