2010-06-05 17 views
5
var i = new int[2]; 

Est-ce que "i" est considéré comme étant encadré?Boxe & Unboxing

+1

Quelle langue? C#? – kennytm

+0

En langage C# .. – Vivek

+1

@MarkRushakoff :) Je sais que c'est un vieux message, mais je me suis moqué de mon cul, renversé du café :))) –

Répondre

4

La matrice en C# est de type référentiel, il n'y a donc pas besoin de boxe. Vous aurez toutefois la boxe dans cet exemple:

var i = 123; 
object o = i; 
7

En supposant qu'il est C# (var et C# -comme la syntaxe de tableau), non, i est non encaissée. Seuls les types de valeur primitive (pensez valeurs numériques) peuvent être encadrés.

Les valeurs du tableau ne sont pas non plus encadrées, car les valeurs des tableaux primitifs ne sont pas encadrées.

+1

Vous pouvez encadrer toute structure, y compris ceux que vous écrivez vous-même, donc la boxe est un peu plus loin que cela implique. Les types de valeur sont implémentés dans .NET en tant que structures. – Donnie

9

Il n'y a rien à emballer. Le mot-clé var ne signifie pas que la variable est boxxed. Il ne fait aucune conversion pendant l'exécution. Le mot-clé var est strictement une construction C#. Qu'est-ce qui se passe réellement lorsque vous utilisez var est:

var i = new int[1]; 

IL voit comme:

int[] i = new int[1] 

Maintenant, si vous demandez si lorsque vous attribuez un entier à une partie du tableau de i-t-il boîte ?

tels que:

i[0] = 2; 

Non, ce ne fonctionne pas.

C'est opposé à ce qui ne:

var o = new object[1]; 

o[0] = 2; 

Cet exemple fait et pourquoi l'utilisation ArrayList (pensez tableau extensible) 1.0, 1.1 (génériques pré) est un coût énorme. Le commentaire suivant applique à l'object[] exemple ainsi:

Tout type de référence ou une valeur qui est ajoutée à un ArrayList est implicitement upcast à l'objet. Si les éléments sont des types de valeur , ils doivent être encadrés lorsque a été ajouté à la liste et décapsulés lorsque ils sont récupérés. Tant la coulée et les opérations de boxe et de déballage dégradent les performances; l'effet de la boxe et le déballage peut être tout à fait significatif dans les scénarios où doit itérer sur de grandes collections.

MSDN Link to ArrayList

Link to Boxing in C#

3

Boxing se produit uniquement lorsqu'un value type (à savoir un type primitif, struct ou énumération) est traité comme un type de référence. Votre tableau est déclaré contenir des valeurs de type int. Le var keyword dit simplement au compilateur d'inférer le type de variable i, plutôt que de le spécifier manuellement.

que vous aviez déjà écrit:

var i = new object[2]; 

Le compilateur se traduirait que pour object[] i = new object[2], et toutes les valeurs int que vous mettez là-bas serait boxed. Tout type de référence que vous mettez dans le même tableau n'aurait pas besoin de boxe. En résumé, var n'a rien à voir avec la boxe.

Voici un diagram of different types dans .NET. Vous pourriez également vouloir lire .NET Type fundamentals.