Question

Compte tenu de cette classe:

public class Foo
{
    public Int32 MyField;
}

Je suppose que le membre « MyField » n'est pas sur la pile de fil parce qu'il pourrait être accessible par plusieurs threads, il doit être sans aucun doute dans le tas managé, mais est-ce que cela signifie qu'il est emballé et chaque fois Unboxed il est utilisé?

Merci d'avance

Était-ce utile?

La solution

Non, ce n'est pas emballé à chaque fois qu'il est utilisé. Boxe ne se produit que lorsque vous Contraindre un type de valeur dans un type de référence - il n'a vraiment rien à voir avec où la mémoire réelle de la valeur a été attribuée (ou même si une mémoire a été allouée).

Dans votre cas, il est comment vous agissez sur MyField qui déterminera si elle est en boîte, pas comment Foo est traité.

  //No Boxing
  var f = new Foo();
  f.MyField = 5;
  int val = f.MyField;


  //Boxing
  var f = new Foo();
  f.MyFIeld = 5;
  object val = f.MyField;

Notez que dans le second exemple val contient maintenant une référence à un int boxed. MyField est encore (et restera toujours) un Unboxed int et est accessible sans unboxing (Merci de remarquer la clarification nécessaire, LukeH )

Autres conseils

Non, le type de valeur est non encaissée.

Boxe se produit uniquement lorsque vous utilisez un type de valeur que si elle est un objet, par exemple lors de l'enregistrement d'un int dans un tableau de object. C'est:

object[] a = new object[10];
int x = 1;
a[0] = x;

Dans ce cas, le type de valeur est encadré.

Mais un type de valeur stockée comme un champ dans une classe est non encaissée.

n, la boxe ne se produit que lorsqu'un type de valeur est traitée comme une System.Object (habituellement par coulée implicite, à savoir le transmettre en tant que paramètre de la méthode)

Les types de valeur se boxed seulement quand ils sont affectés à une variable de type de référence (par exemple object). Si vous n'attribuez MyField à quoi que ce soit autre qu'un int ou d'une autre struct auquel il peut être lancé (par exemple double), il ne sera jamais en boîte.

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