Pregunta

Teniendo en cuenta esta clase:

public class Foo
{
    public Int32 MyField;
}

supongo que el miembro de "MiCampo" no está en la pila de subprocesos porque como podría ser accedido por varios hilos, tiene que ser definitivamente en el montón administrado, pero no significa que está encajonado y cada vez que sacó de la caja que se utiliza?

Gracias de antemano

¿Fue útil?

Solución

No, no es en caja cada vez que se utiliza. El boxeo sólo se produce cuando se está coaccionando a un tipo de valor en un tipo de referencia - que realmente no tiene nada que ver con el lugar donde se asigna la memoria real para el valor (o incluso si se asigna ninguna memoria).

En su caso, es la forma de actuar en MiCampo que determinará si está en caja, no la forma de Foo es tratada.

  //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;

Tenga en cuenta que en el segundo ejemplo val ahora contiene una referencia a un int en caja. MyField sigue siendo (y siempre será) un int sacó de la caja y se puede acceder sin unboxing (gracias por señalar la aclaración necesaria, LukeH )

Otros consejos

No, el tipo de valor no está en un recuadro.

boxeo sólo se produce cuando se utiliza un tipo de valor como si fuera un objeto, por ejemplo, al almacenar un int en una variedad de object. Es decir:

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

En ese caso, se encajona el tipo de valor.

Pero un tipo de valor almacenado como un campo dentro de una clase no está en caja.

No, el boxeo sólo se produce cuando un tipo de valor se trata como un System.Object (generalmente por la conversión implícita, es decir, pasando como un parámetro del método)

Los tipos de valor sólo se consigue en caja cuando están asignados a una variable de tipo de referencia (por ejemplo, object). Si MyField Nunca le otorgue a otra cosa que un int u otra estructura a la que puede ser fundido (por ejemplo double) nada, no va a estar dentro de cajas cada vez.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top