Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 di 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 della 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 una dimensione di istanza ridotta e prendere in considerazione le caratteristiche delle prestazioni delle classi rispetto alle strutture.
Somiglianze
Le strutture e le classi sono simili nei seguenti aspetti:
Entrambi sono tipi di contenitore , ovvero contengono altri tipi come membri.
Entrambi hanno membri, che possono includere costruttori, metodi, proprietà, campi, costanti, enumerazioni, eventi e gestori eventi.
I membri di entrambi possono avere livelli di accesso individuali. Ad esempio, un membro può essere dichiarato
Public
e un altroPrivate
.Entrambi possono implementare interfacce.
Entrambi possono avere costruttori condivisi, con o senza parametri.
Entrambi possono esporre una proprietà predefinita, purché tale proprietà accetta almeno un parametro.
Entrambi possono dichiarare e generare eventi ed entrambi possono dichiarare delegati.
Differenze
Le strutture e le classi variano in base ai seguenti aspetti:
Le strutture sono tipi valore; le classi sono tipi di riferimento. Una variabile di un tipo di struttura contiene i dati della struttura, anziché contenere un riferimento ai dati come 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 di classe e le costanti sonoPrivate
per impostazione predefinita, mentre altri membri della classe sonoPublic
per impostazione predefinita. Questo comportamento per i membri della classe garantisce la compatibilità con il sistema visual Basic 6.0 delle impostazioni predefinite.Una struttura deve avere almeno una variabile non condivisa o un elemento evento non condiviso, non personalizzato; una classe può essere completamente vuota.
Gli elementi della struttura non possono essere dichiarati come
Protected
; i membri della classe possono.Una routine struttura può gestire gli eventi solo se si tratta di una routine Condivisa
Sub
e solo tramite l'istruzione AddHandler. Qualsiasi routine di classe può gestire eventi, usando la parola chiave Handle o l'istruzioneAddHandler
. Per altre informazioni, vedere Events.Le dichiarazioni di variabili di struttura non possono specificare inizializzatori o dimensioni iniziali per le matrici; le dichiarazioni delle variabili di classe possono.
Le strutture ereditano in modo implicito dalla System.ValueType classe e non possono ereditare da qualsiasi altro tipo. Le classi possono ereditare da qualsiasi classe o classe diversa da System.ValueType.
Le strutture non sono ereditabili; le classi sono.
Le strutture non vengono mai terminate, quindi Common Language Runtime (CLR) non chiama mai il Finalize metodo in alcuna struttura. Le classi vengono terminate dal Garbage Collector (GC), che chiama Finalize su una classe quando rileva che non sono presenti riferimenti attivi rimanenti.
Una struttura non richiede un costruttore; una classe esegue questa operazione.
Le strutture possono avere costruttori che non sono condivisi solo se richiedono parametri; le classi possono avere costruttori con parametri o senza.
Ogni struttura ha un costruttore pubblico implicito senza parametri. Questo costruttore inizializza tutti gli elementi dati della struttura sui valori predefiniti. Non è possibile ridefinire questo comportamento.
Istanze e variabili
Poiché le strutture sono tipi valore, ogni variabile di struttura è associata in modo permanente a una singola istanza della struttura. Tuttavia, le classi sono tipi di riferimento e una variabile oggetto può fare riferimento a diverse istanze di classe in momenti diversi. Questa distinzione influisce sull'utilizzo di strutture e classi nei modi seguenti:
Inizializzazione. Una variabile di struttura include in modo implicito un'inizializzazione degli elementi usando il costruttore senza parametri della struttura. Pertanto,
Dim s As struct1
è equivalente aDim 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 di nulla. È possibile assegnare il valore Nothing a una variabile di struttura, ma l'istanza continua a essere associata alla variabile. È comunque possibile chiamare i metodi e accedere ai relativi elementi dati, anche se gli elementi delle variabili 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 si assegna un'altra istanza.Molteplici istanze. Una variabile oggetto può avere istanze di classe diverse assegnate in momenti diversi e diverse variabili oggetto possono fare riferimento alla stessa istanza di classe contemporaneamente. Le modifiche apportate ai valori dei membri della classe influiscono su tali membri quando 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 valori non vengono riflesse in altre variabili di struttura, anche in altre istanze della stessa
Structure
dichiarazione.Uguaglianza. I test di uguaglianza di due strutture devono essere eseguiti con un test elemento per elemento. È possibile confrontare due variabili oggetto usando il Equals metodo . Equals indica se le due variabili puntano alla stessa istanza.