Boxing e Unboxing dei Value | ||
Differenze tra Value e Reference Type |
Il Boxing dei value è un concetto essenziale nel sistema dei tipi del C#. Con il boxing e l'unboxing si può realizzare un collegamento tra i value type e i reference type permettendo che il valore di un value type sia converto da e verso un oggetto. Questo processo consente una visione unificata del type system in quanto un valore di qualunque tipo può alla fine essere trattato come oggetto. E' per questo motivo che quando si parla di C# si può affermare con sicurezza che "tutto è un oggetto", contrariamente a quanto avviene in Java che fornisce un class wrapper per ogni primitiva, come la classe Integer per int e la classe Byte per byte. Convertire un value type in un reference type è detto Boxing, il processo inverso Unboxing. Il Boxing avviene automaticamente quando un value type è utilizzato in una locazione che richiederebbe l'uso di un oggetto. Il Boxing di un value type consiste nell'allocare l'istanza di un oggetto e copiare il valore nell'istanza. Come più volte sottolineato, C# fornisce un type system unificato, tutti i tipi compresi i value type, derivano da oggetti. E' possibile richiamare metodi di oggetti su ogni valore, persino valori di tipi "primitivi" come int. In questo esempio il metodo ToString, definito come oggetto viene chiamato su di un integer: using System; class Test { static void Main() { Console.WriteLine(3.ToString()); } } In quest'altro esempio invece un int value viene convertito in un oggetto e poi di nuovo in un int: using System; class Test { static void Main() { int i = 1; object o = i; // boxing // verifica che o sia davvero un int if (o is int) { Console.Write("O is an int"); } int j = (int) o; // unboxing } }
Questo esempio ha mostrato sia il boxing che l'unboxing. Quando una variabile di un value type necessita di essere convertita in un reference type, un "oggetto scatola" viene allocato per contenere il valore, quindi il valore è copiato nella scatola. L'unboxing è l'opposto: quando una "oggetto scatola" è fatto tornare al suo valore originale, il valore è copiato fuori dalla scatola nella appropriata locazione di memorizzazione.
Fonti: Documentazione .NET Framework SDK http://www.oreillynet.com/pub/a/dotnet/2001/06/07/csharp_java.html?page=4 |