Sommaire

L’unboxing

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

1. Invalidité du boxing/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.

2. Considération sur les performances

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