Reference type e value type

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
  • BooleanCharDate
  • 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.

Lascia un commento