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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top