Nell’ultimo articolo di questa sezione abbiamo visto i principali tipi elementari dei due linguaggi da noi studiati, C# e VB.NET. Ciò che però non è stato detto è che in realtà esistono due tipi di tipi di dati in Visual Basic: Reference Type e Value Type. Sul sito ufficiale Microsoft, società creatrice del software, troviamo la seguente definizione: “Le variabili dei tipi di riferimento archiviano i riferimenti ai relativi dati (oggetti), mentre le variabili dei tipi di valore contengono direttamente i dati”. Ma cosa significa esattamente questo? In altre parole possiamo dire che ai value type appartengono i tipi per i quali le variabili rappresentano esse stesse la locazione di memoria del dato, cioè la variabile immagazzina il dato stesso. Per i tipi reference type invece le variabili rappresentano un puntatore, un riferimento al dato che non viene perciò immagazzinato nella variabile.
Questa distinzione si è resa necessaria da quando è possibile creare dati molto grandi, che occupano cioè molta memoria. Infatti potrebbe essere molto complicato dal punto di vista computazionale modificare o compiere operazioni con variabili che rappresentano dati molto pesanti. Per questo motivo quando si lavora con dati di questo tipo si utilizza un loro riferimento, mentre per dati molto più piccoli non c’è bisogno, e quindi si possono usare i dati stessi. Ad esempio quando, nel precedente articolo, abbiamo illustrato i principali tipi di dati elementari, abbiamo parlato anche dl tipo StringBuilder, che permette di creare variabili che contengono lunghe stringhe, addirittura come tutta la Bibbia. Per questo motivo, il tipo StingBuilder, come il tipo String, è un reference type, mentre tutti gli altri tipi illustrati sono value type.
Il programmatore però potrebbe decidere di creare nuovi tipi di dati oltre ai tipi elementari. In questo caso si andranno ad usare due nuove procedure. In VB.NET esse sono chiamate Class e Structure; il primo crea un reference type, mentre il secondo crea un value type. Le procedure equivalenti in C# sono invece class e struct. Per poter apprezzare la differenza tra i due tipi facciamo un esempio di sub routine in C#
{
Studente_S s_1 = new Studente_S();
s_1.Eta = 25;
s_1.Peso = 79;
Studente_S s_2 = new Studente_S();
s_2 = s_1
S_2.Eta = 26;
s_2.Peso = 80;
}
In questo caso il tipo Studente_S, creato con una struct, rappresenta un value type. Se si chiedesse di stampare le variabili s_1 e s_2 otterremmo i seguenti valori : (25,79),(26,80) poiché inizialmente la variabile s_2 assume i stessi valori di età e peso della variabile s_1 ( (25,79) ), ma successivamente tali valori vengono modificati ( (26,80) ).
Se invece il tipo Studente_S fosse stato creato con una class, rappresenterebbe un reference type. In questo caso se si chiedesse di stampare i valori delle due variabili si otterrebbe (26,80),(26,80) poiché quando viene eseguita l’istruzione “s_2 = s_1” non sono manipolati i valori della variabili, ma il riferimento si s_1, che viene reso uguale a quello della variabile s_2; le due variabili perciò punteranno alla stessa locazione di memoria, lavorando quindi sulla stessa classe. Il medesimo esempio si può vedere con il linguaggio VB.NET.
In conclusione va detto che quando si utilizzano in un codice classi o strutture, è buona norma inserirle in altri file di codice, in modo da rendere più “pulito” il codice principale del programma.
