
In Visual Basic vengono trattati solo due diversi types: i reference type e i value type. La principale (e fondamentale) differenza consiste nel fatto che i value type allocano una porzione di memoria direttamente riempita con il valore d’interesse, mentre i reference type contengono contengono un puntatore ad un oggetto (e quindi al relativo valore). Questa differenza è fondamentale, in quanto stravolge completamente il funzionamento dei due types. Ad esempio, infatti, quando si copia il valore di una variabile in una seconda è fondamentale conoscere il type della prima. Nel caso si trattasse di un value type, nella seconda variabile verrà copiato direttamente il valore contenuto nella prima e le due variabili lavoreranno indipendentemente. I reference type, invece, se copiati in una seconda variabile, creano una seconda copia del puntatore allo stesso oggetto. Questo implica che una modifica al valore di una delle due variabili comporta una variazione all’oggetto identificato dal puntatore e quindi qualsiasi variabile conterrà il puntatore a quell’oggetto vedrà il valore di quest’ultimo modificato.
Alcuni esempi di value type sono i seguenti:
- Tutti i tipi di dati numerici
Boolean,ChareDate- Tutte le strutture, anche se i relativi membri sono reference type
Alcuni esempi di reference type sono i seguenti:
String- Tutte le matrici, anche se i relativi elementi sono value type
- Tipi di classe, ad esempio Form
- Delegati
Per quanto riguarda la definizione di questi due type in C# e VB.net, in entrambi i linguaggi, i reference type sono dichiarati attraverso l’istruzione Class, mentre i value type vengono dichiarati attraverso l’istruzione Structure. Di seguito sono riportati i codici di esempio per dichiarare i due type descritti finora nei due linguaggi:
VB.net
C#
Reference Type
Public Class Studente_C
Public Eta As Double
Public Peso As Double
End Class
class Studente_C
{
public double Eta;
public double Peso;
}
Value Type
Public Structure Studente_S
Public Eta As Double
Public Peso As Double
End Structure
struct Studente_S
{
public double Eta;
public double Peso;
}
Come si può notare, la sintassi è molto simile. L’unica differenza è sulla compattezza del codice, che però rimane una differenza che caratterizza i due codici nel complesso.