Gráfico de comparação
Base para Comparação | Boxe | Unboxing |
---|---|---|
Basic | Tipo de objeto refere-se ao tipo de valor. | processo de recuperação de valor do objeto em caixa. |
Armazenamento | O valor armazenado na pilha é copiado para o objeto armazenado na memória heap. | O valor do objeto armazenado na memória heap é copiado para o tipo de valor armazenado na pilha. |
Conversão | Conversão implícita. | Conversão explícita. |
Exemplo | int n = 24; objeto ob = n; | int m = (int) ob; |
Definição de Boxe
O boxe é um procedimento de conversão de um tipo de valor para um tipo de objeto. Aqui, o tipo de valor é armazenado na pilha e o tipo de objeto é armazenado na memória heap. Essa conversão do tipo de valor para o tipo de objeto é uma conversão implícita. Você pode atribuir diretamente um valor a um objeto e o C # manipulará a conversão restante. Vamos entender Boxe com um exemplo.
int i = 24; objeto ob = i; // Box o tipo inteiro n no tipo de objeto ob. ou objeto ob1 = 21; // aqui também um tipo de objeto ob1 se refere a um tipo inteiro
No código acima, o tipo inteiro i contendo o valor 24 é armazenado na pilha e copiado para o tipo de objeto ob. Um tipo de objeto agora está se referindo a um valor inteiro. Agora, o “int i” também contém o valor 24 e o “tipo de objeto ob” também contém o valor 24, mas ambos os valores são independentes um do outro, ou seja, se você alterar o valor de i, ele não refletirá a mudança no valor de ob.
Boxe consome memória extra junto com o tempo extra. A razão é que um novo objeto, que se referirá ao tipo de valor, deve alocar o espaço de memória no heap. Em seguida, o valor do tipo de valor armazenado na pilha será transferido para o tipo de objeto, no local da memória de heap.
Definição de Unboxing
O reverso do boxe é Unboxing. Unboxing é uma conversão do tipo de objeto para o tipo de valor. Em Unboxing, o valor do tipo de objeto em caixa armazenado no heap é transferido para o tipo de valor armazenado na pilha. Ao contrário do boxe, o Unboxing tem que ser feito explicitamente. O tipo de objeto é explicitamente convertido para o tipo de valor e o tipo de valor deve ser o mesmo valor ao qual o tipo de objeto está se referindo. Vamos entender o conceito de Unboxing com um exemplo.
int i = 24; objeto ob = i; // Box o tipo inteiro n no tipo de objeto ob. int j = (int) ob; // Unbox o valor inteiro armazenado no tipo de objeto ob para o tipo inteiro y.
O valor armazenado no objeto ob é recuperado, lançando-o para o mesmo tipo que o objeto estava se referindo, ou seja, o tipo de inteiro "j".
Unboxing também consome mais memória e mais tempo. Desde que, quando um tipo de objeto precisa ser descompactado, o valor do tipo de objeto armazenado no heap deve ser transferido para o novo tipo de valor armazenado na pilha. O tipo de objeto cujo valor foi recuperado estará agora disponível para coleta de lixo.
Principais diferenças entre boxe e unboxing
- No boxe, um objeto é feito para se referir como um tipo de valor. Por outro lado, o processo de recuperar o valor de volta do objeto em caixa é chamado de unboxing.
- Um tipo de valor armazenado em uma pilha é copiado para o objeto armazenado na memória heap. Por outro lado, no unboxing, um objeto armazenado na memória heap é copiado para um tipo de valor armazenado na memória da pilha.
- O boxe é uma conversão implícita, enquanto unboxing é uma conversão explícita.
Conclusão:
Tanto o boxe quanto o unboxing consomem mais tempo e memória, e são computacionalmente caros. Eles também não possuem segurança de tipo e aumentam a sobrecarga de tempo de execução. É sempre aconselhável evitar o uso excessivo de boxe e unboxing no programa.