Question

De MSDN je lis que la boxe / unboxing est pour le traitement de valeur types comme des objets. Mais quand je lis au sujet ArrayList, il lit qu'il ne la boxe aussi bien. Je suis donc tout à fait confus que ArrayList détient la valeur et les types de référence comme des objets. De plus, le suivant est pas unboxing en termes de terminologie, son juste casting?

ArrayList a=new ArrayList();
a.Add(someClass);

someClass x=(someClass)a[0];
Était-ce utile?

La solution

ArrayList la boxe pour les types exécute de valeur, mais pas les types de référence. Ou plutôt, ArrayList lui-même ne fait pas la boxe - le compilateur fait. Par exemple:

ArrayList list = new ArrayList();
list.Add(5);

est effectivement

ArrayList list = new ArrayList();
object boxed = 5; // Perform boxing from value type type
list.Add(boxed);

Votre exemple est en effet simplement coulée - une conversion de référence, et non une conversion unboxing. Une valeur de type de référence n'a pas besoin d'être acculé à stocker dans un ArrayList -. Il est déjà une référence

Encore une fois, c'est vrai de la boxe en général, et non spécifique à ArrayList. La boxe est juste une façon d'utiliser une valeur de type de valeur où vous vraiment veulent une référence ... une référence doit être à un objet, de sorte que le CLR crée un objet pour envelopper la valeur valeur de type, et renvoie une référence à cette enveloppe (le stockage de la valeur « box »).

Autres conseils

Boxe / unboxing est une caractéristique de la langue et l'exécution, pas une caractéristique de ArrayList. Grosso modo, c'est la conversion d'un type de valeur de / au type de Object , et depuis ArrayList prend en Objects, tout type de valeur que vous passez seront automatiquement mis en boîte avec l'instruction IL de box.

Plus précisément, la boxe / unboxing implique la création ou l'examen d'un nouvel objet, et la copie des données du type de valeur de la pile vers le tas (ou vice versa). Il est assez cher, et que vous souhaitez l'éviter si possible.

Dans le cas des types de référence, aucun code de boxe est normalement généré; une instruction de unbox qui fonctionne sur un type de référence est, en outre, tout simplement ignorée.

Je trouve utile de penser à des types de valeur comme étant en dehors du système de type de classe, mais considère tous les types de valeur comme ayant un type de référence correspondant invisible dérivé de ValueType (qui dérive à son tour de l'objet) qui se comporte essentiellement comme une classe les mêmes membres que Foo, mais soutient l'élargissement des moulages vers et à partir du type de valeur réelle.

Si un type de valeur est passée au code qui attend un dérivé de l'objet, il sera coulé au type de référence invisible appropriée; si un objet de ce type de référence est affecté à une variable de type valeur, il sera coulé en arrière.

BTW, si j'avais le choix, il y aurait un moyen de préciser que quelque chose autre que le procédé de coulée par défaut doit être utilisé, mais pas une telle fonction existe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top