Casino online











Mercato forex






A7. Tipi Reference e tipi Value


Tutti i tipi di variabile che possono essere creati si raggruppano sotto due grandi categorie: Reference e Value. I primi si comportano come oggetti, mentre i secondi rappresentano tipi scalari o numerici.


Tipi Reference
Ogni cosa nel Framework è un oggetto e la maggior parte di essi sono tipi reference. Nel capitolo precedente si è visto come sia possibile assegnare un valore ad una variabile utilizzando l'operatore uguale '='. Con questo meccanismo, un determinato valore viene depositato nella casella di memoria che la variabile occupa. Ebbene, facendo uso dei tipi reference, questo non avviene. Quando si utilizza l'uguale per assegnare un valore a tali tipi, quello che effettivamente viene riposto nella loro parte di memoria è un puntatore intero a 32bit (su sistemi operativi a 32bit). Per chi non lo sapesse, un puntatore è una variabile che, invece di contenere un proprio valore, contiene l'indirizzo a un'area di memoria contenente altri dati. Il puntatore viene memorizzato come al solito sullo stack, mentre il vero oggetto viene creato e deposto in un'area di memoria differente, detta heap managed, dove esiste sotto la supervisione del CLR. Quando una variabile di questo tipo viene impostata a Nothing (una costante che vedremo tra poco), la parte dell'heap managed che l'oggetto occupa viene rilasciata durante il processo di garbage collection. Tuttavia ciò non avviene subito, poichè il meccanismo del Framework fa in modo di avviare la garbage collection solo quando è necessario, quindi quando la memoria comincia a scarseggiare: supponendo che un programma abbia relativamente pochi oggetti, questi potrebbero "vivere" indisturbati fino alla fine del programma anche dopo essere stati logicamente distrutti, il che significa che è stato eliminato manualmente qualsiasi riferimento ad essi. Data l'impossibilità di determinare a priori quando un oggetto verrà distrutto, si ha un fenomeno che va sotto il nome di finalizzazione non deterministica (il termine "finalizzazione" non è casule: vedere il capitolo sui distruttori per maggiori informazioni).


Nothing
Nothing è una costante di tipo reference che rappresenta l'assenza di un oggetto piuttosto che un oggetto nullo. Infatti, porre una variabile oggetto uguale a Nothing equivale a distruggerla. Non è possibile assegnare Nothing a un tipo value, ma è possibile usare speciali tipi value che supportano tale valore: per ulteriori dettagli, vedere "Tipi Nullable".


Tipi Value
Ogni tipo value deriva dalla classe System.ValueType, che deriva a sua volta da System.Object, ma ne ridefinisce i metodi. Ogni variabile di questo tipo contiene effettivamente il proprio valore e non un puntatore ad esso. Inoltre, hanno dei vantaggi in termini di memoria e velocità: occupano in genere meno spazio; data la loro posizione sullo stack non vi è bisogno di referenziare un puntatore per ottenere o impostarne i valori (referenziare un puntatore significa recarsi all'indirizzo di memoria puntato e analizzarne il contenuto); non c'è necessità di occupare spazio nello heap managed: se la variabile viene distrutta cessa di esistere all'istante e non si deve attuare nessuna operazione di rilascio delle risorse.


Is e =
Nel lavorare con tipi reference e value bisogna prestare molta attenzione a quando si utilizzano gli operatori di assegnamento. Come già detto i reference contengono un puntatore, perciò se si scrive questo codice:
Dim O1, O2 As Object
O1 = O2 
quello che O2 conterrà non sarà un valore identico a O1, ma un puntatore alla stessa area di memoria di O1. Questo provoca un fatto strano, poichè sia O1 che O2 puntano alla stessa area di memoria: quindi O1 e O2 sono lo stesso oggetto, soltanto riferito con nomi difersi. In casi simili, si può utilizzare l'operatore Is per verificare che due oggetti puntino allo stesso valore:
'Scrive a schermo se è vero oppure no che
'O1 e O2 sono lo stesso oggetto
Console.WriteLine(O1 Is O2) 
La scritta che apparirà sullo schermo sarà "True", ossia "Vero".
Questo NON avviene per i tipi value: quando ad un tipo value si assegna un altro valore con l'operatore =, si passa effettivamente una copia del valore. Non è possibile utilizzare Is con i tipi value poichè Is è definito solo per i reference.


Boxing e Unboxing
Consideriamo il seguente codice:
Dim I As Int32 = 50
Dim O As Object
O = I 
I è un tipo value, mentre O è un tipo reference. Quello che succede dietro le quinte è semplice: il .Net crea un nuovo oggetto, perciò un tipo reference, con il rispettivo puntatore, e quindi gli assegna il valore di I: quando il processo è finito assegna il puntatore al nuovo oggetto a O. Questa conversione spreca tempo e spazio nello heap managed e viene definita come boxing. L'operazione inversa è l'unboxing e consiste nell'assegnare un tipo reference a un tipo value. Le operazioni che si svolgono sono le stesse, ma al contrario: entrambe sprecano tempo e cpu, quindi sono da evitare se non strettamente necessarie. Quando si può scegliere, quindi, sono meglio di tipi value.





 

The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.