Um valueType é encaixotado quando é declarado como parte de uma classe?
-
26-09-2019 - |
Pergunta
Considerando esta aula:
public class Foo
{
public Int32 MyField;
}
Eu acho que o membro "myfield" não está na pilha de threads porque, como pode ser acessado por vários threads, ele deve estar definitivamente na pilha gerenciada, mas significa que é embalada e não caixa sempre que for usada?
desde já, obrigado
Solução
Não, não é encaixotado toda vez que é usado. O boxe ocorre apenas quando você está coagindo um tipo de valor em um tipo de referência - ele realmente não tem nada a ver com onde a memória real para o valor foi alocada (ou mesmo se alguma memória foi alocada).
No seu caso, é como você age em Myfield que determinará se é encaixotado, não como o Foo é tratado.
//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;
Observe que no segundo exemplo val
agora contém uma referência a um int. MyField
ainda é (e sempre permanecerá) um INT não caixa e pode ser acessado sem unboxing (obrigado por apontar o esclarecimento necessário, Lukeh)
Outras dicas
Não, o tipo de valor não está em caixa.
O boxe ocorre apenas quando você usa um tipo de valor como se fosse um objeto, por exemplo, ao armazenar um int
em uma variedade de object
. Aquilo é:
object[] a = new object[10];
int x = 1;
a[0] = x;
Nesse caso, o tipo de valor está em caixa.
Mas um tipo de valor armazenado como um campo dentro de uma classe não é encaixotado.
Não, o boxe ocorre apenas quando um tipo de valor é tratado como um sistema.
Os tipos de valor só são em caixa quando atribuídos a uma variável de tipo de referência (por exemplo, object
). Se você nunca atribuir MyField
para qualquer coisa que não seja uma int ou outra estrutura para a qual ela pode ser lançada (por exemplo double
), nunca será encaixotado.