¿Un ValueType conseguir en caja cuando se declara como parte de una clase?
-
26-09-2019 - |
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
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.