Differenze tra Value e Reference Type

.::Home::.

.::Introduzione::.

1.Panoramica

4.DataBase

.::Presentazioni PPT::.

.::Link::.

.::DownLoad::.

 

Nonostante lo scambio di valori tra Value e Reference Type sia reso trasparente dai meccanismi di boxing e unboxing bisogna comunque conoscere le differenze che intercorrono tra i due tipi.

I tipi Reference sono sempre allocati dal Managed Heap e i nuovi operatori restituiscono l'indirizzo di memoria dell'oggetto, ovvero l'indirizzo fa riferimento ai bit dell'oggetto. Essendo allocata memoria dal Managed Heap, avviene una garbage collection con relativo decremento di prestazioni.

I Value type invece sono solitamente allocati nello stack del thread (ma potrebbero anche essere incapsulati in un oggetto di tipo Reference) e la variabile che rappresenta l'oggetto non contiene un puntatore ad esso, ma direttamente il valore dell'oggetto stesso. I Value type non sono sotto il controllo del Garbage Collector.

Nella documentazione ogni tipo denominato "Class" è un Reference type, ogni "Structure" invece un Value.

L'esempio che segue accentua le differenze (e l' attenzione che bisogna porre nella relativa manipolazione)

using System;

// E' un tipo Reference (a causa del 'class')
class  RefType { public int x; }

// E' un tipo Value (a causa del 'struct')
struct ValType { public int x; }

class App {
   static void Main() {
      RefType rt1 = new RefType();  // Allocato nell'heap
      ValType vt1 = new ValType();  // Allocato nello stack
      rt1.x = 10;	            // Cambia il riferimento a cui punta
      vt1.x = 10;                   // Cambiato il valore nello stack

      RefType rt2 = rt1;             // Copia il solo puntatore
      ValType vt2 = vt1;             // Alloca nello stack e copia i membri
      rt1.x = 20;                     
      vt1.x = 20;                   
      Console.WriteLine("rt1.x = {0}, rt2.x = {1}", rt1.x, rt2.x);
      Console.WriteLine("vt1.x = {0}, vt2.x = {1}", vt1.x, vt2.x);

      Console.Write("Press Enter to close window...");
      Console.Read();
   }
}

Appartemente un Reference Type (rt) e un Value Type (vt) affini, sottoposti alle stesse operazioni, danno risultati diversi:

In realtà bisogna considerare le differenze strutturali che li contraddistinguono:

Ad entrambi i tipi viene assegnato il valore 10.
rt1.x punta ad una locazione di memoria che contiene il valore 10. Vt1.x invece contiene direttamente il valore 10.

Il contenuto di rt1 viene copiato in rt2, quindi i due diventatano puntatori alla stessa locazione.

Il contenuto di vt1 viene copiato in vt2 che ora contiene il valore 10.

Ad rt1.x viene assegnato ora il valore 20, essendo modificato il valore nella locazione di memoria puntata da rt1, anche rt2 punta al valore 20.

A vt1.x viene assegnato il valore 20, la qual cosa non modifica il valore contenuto in vt2.x che rimane 10.

Concludendo:

rt1.x= 20; rt2.x=20

vti1.x:=20; vt2.x=10.

 

 

 

Fonti:

Documentazione .NET Framework SDK

.::^top^::.

(2002) A cura di Carlo Becchi