Réciproquement, si on veut passer d’un type référence à un type valeur :
1.
il faut identifier la valeur pointée par l’adresse stockée dans la pile (qui est sur le tas) ;
2.
copier cette valeur directement dans la pile.
Si on poursuit l’exemple précédent :
int b = (int)obj ; // on procède à un unboxing
En cas de tentative de boxing/unboxing que le système ne peut assurer, le runtime déclenche une exception, InvalidCastException. Un boxing ou un unboxing inappropriés ne sont pas détectables à la compilation. C’est bien à l’exécution (au runtime) que l’opération va être évaluée et va éventuellement échouer.
Le boxing et l’unboxing impliquent donc de procéder à des copies sur le tas ou sur la pile, autant d’opérations qui ont un coût et qui peuvent dégrader le niveau de performances de l’applicatif développé. C’est particulièrement vrai avec des conteneurs de collections qui ne sont pas génériques, tels que l’ArrayList, par exemple.
L’une des solutions est de recourir aux types génériques qui peuvent constituer un type référence tout en incluant un type valeur ; par exemple, utiliser un Nullable<int>.
Abonnement
tous les livres et vidéos ENI en illimité sans engagement
du livre imprimé ou du livre numérique