Strutture e classi (Visual Basic)

Visual Basic unifica la sintassi per strutture e classi, con il risultato che entrambe le entità supportano la maggior parte delle stesse funzionalità. Esistono tuttavia anche differenze importanti tra strutture e classi.

Le classi hanno il vantaggio di essere tipi riferimento: il passaggio di un riferimento è più efficiente rispetto al passaggio di una variabile di struttura con tutti i relativi dati. D'altra parte, le strutture non richiedono l'allocazione di memoria nell'heap globale.

Poiché non è possibile ereditare da una struttura, le strutture devono essere utilizzate solo per gli oggetti che non devono essere estesi. Usare le strutture quando l'oggetto che si desidera creare ha un'istanza di dimensioni ridotte e prendere in considerazione le caratteristiche delle prestazioni delle classi rispetto alle strutture.

Somiglianze

Le strutture e le classi sono simili nei seguenti aspetti:

  • Entrambe sono tipi contenitore, ovvero contengono altri tipi come membri.

  • Entrambe hanno membri, che possono includere costruttori, metodi, proprietà, campi, costanti, enumerazioni, eventi e gestori eventi.

  • I membri di entrambe possono avere livelli di accesso personalizzati. Ad esempio, un membro può essere dichiarato Public e un altro Private.

  • Entrambe possono implementare interfacce.

  • Entrambe possono avere costruttori condivisi, con o senza parametri.

  • Entrambe possono esporre una proprietà predefinita, purché tale proprietà accetti almeno un parametro.

  • Entrambe possono dichiarare e generare eventi ed entrambe possono dichiarare delegati.

Differenze

Le strutture e le classi differiscono nei seguenti particolari:

  • Le strutture sono tipi valore, non tipi riferimento. Una variabile di un tipo di struttura contiene i dati della struttura, anziché contenere un riferimento ai dati come fa un tipo di classe.

  • Le strutture usano l'allocazione dello stack; le classi usano l'allocazione dell'heap.

  • Tutti gli elementi della struttura sono Public per impostazione predefinita; le variabili e le costanti della classe sono Private per impostazione predefinita, mentre gli altri membri della classe sono Public per impostazione predefinita. Questo comportamento per i membri della classe garantisce la compatibilità con il sistema predefinito di Visual Basic 6.0.

  • Una struttura deve avere almeno una variabile non condivisa o un elemento evento non condiviso e non personalizzato; una classe può essere completamente vuota.

  • Gli elementi della struttura non possono essere dichiarati come Protected, mentre i membri della classe sì.

  • Una routine della struttura può gestire eventi solo se si tratta di una routine CondivisaSub e solo tramite l'istruzione AddHandler. Qualsiasi routine della classe può gestire eventi usando la parola chiave Handle o l'istruzione AddHandler. Per altre informazioni, vedere Events.

  • Le dichiarazioni di variabili della struttura non possono specificare inizializzatori o dimensioni iniziali per le matrici, mentre le dichiarazioni di variabili della classe sì.

  • Le strutture ereditano in modo implicito dalla classe System.ValueType e non possono ereditare da nessun altro tipo. Le classi possono ereditare da qualsiasi classe o da classi diversa da System.ValueType.

  • Le strutture non sono ereditabili, mentre le classi sì.

  • Le strutture non vengono mai terminate, quindi Common Language Runtime (CLR) non chiama mai il metodo Finalize in alcuna struttura. Le classi vengono terminate dal Garbage Collector (GC), che chiama Finalize in una classe quando rileva che non sono rimasti riferimenti attivi.

  • Una struttura non richiede un costruttore, mentre una classe sì.

  • Le strutture possono avere costruttori non condivisi solo se accettano parametri; le classi possono averli con o senza parametri.

Ogni struttura ha un costruttore pubblico implicito senza parametri. Questo costruttore inizializza tutti gli elementi dati della struttura con i valori predefiniti. Non è possibile ridefinire questo comportamento.

Istanze e variabili

Poiché le strutture sono tipi valore, ogni variabile della struttura è associata in modo permanente a una singola istanza della struttura. Le classi invece sono tipi riferimento e una variabile oggetto può fare riferimento a diverse istanze della classe in momenti diversi. Questa distinzione influisce sull'utilizzo di strutture e classi nei modi seguenti:

  • Inizializzazione. Una variabile della struttura include in modo implicito un'inizializzazione degli elementi usando il costruttore senza parametri della struttura. Pertanto, Dim s As struct1 è equivalente a Dim s As struct1 = New struct1().

  • Assegnazione di variabili. Quando si assegna una variabile di struttura a un'altra o si passa un'istanza della struttura a un argomento di routine, i valori correnti di tutti gli elementi della variabile vengono copiati nella nuova struttura. Quando si assegna una variabile oggetto a un'altra o si passa una variabile oggetto a una routine, viene copiato solo il puntatore di riferimento.

  • Assegnazione del valore Nothing. È possibile assegnare il valore Nothing a una variabile della struttura, ma l'istanza continua a essere associata alla variabile. È comunque possibile chiamare i relativi metodi e accedere ai relativi elementi dati, anche se gli elementi della variabile vengono reinizializzati dall'assegnazione.

    Al contrario, se si imposta una variabile oggetto su Nothing, la si dissocia da qualsiasi istanza della classe e non è possibile accedere ad alcun membro tramite la variabile finché non le si assegna un'altra istanza.

  • Istanze multiple. A una variabile oggetto possono essere assegnate istanze di classe diverse in momenti diversi e più variabili oggetto possono fare riferimento alla stessa istanza di classe nello stesso momento. Le modifiche apportate ai valori dei membri della classe influiscono su tali membri quando vi si accede tramite un'altra variabile che punta alla stessa istanza.

    Gli elementi della struttura, tuttavia, sono isolati all'interno della propria istanza. Le modifiche apportate ai relativi valori non si riflettono in altre variabili della struttura, neanche in altre istanze della stessa dichiarazione Structure.

  • Uguaglianza. I test di uguaglianza di due strutture devono essere eseguiti con un test elemento per elemento. È possibile confrontare due variabili oggetto usando il metodo Equals. Equals indica se le due variabili puntano alla stessa istanza.

Vedi anche