Sunteți pe pagina 1din 7

22/02/2017 Conversesboxingeunboxing(GuiadeProgramaoemC#)

Converses boxing e unboxing Guia de


Programao em C#
Visual Studio 2015

Publicado: agosto de 2016

Para obter a documentao mais recente do Visual Studio 2017 RC, consulte a documentao do Visual Studio 2017 RC
http://docs.microsoft.com/visualstudio.

O encapsulamento um processo de converso de um tipo de valor https://msdn.microsoft.com/pt


br/library/s1ax56ch.aspx para o tipo object ou para qualquer tipo de interface implementado por este tipo de valor.
Quando o CLR fecha um tipo de valor, ele envolve o valor dentro de um System.Object e o armazena no heap gerenciado. O
unboxing extrai o tipo do valor do objeto. O encapsulamento implcito; o desencapsulamento explcito. O conceito de
boxing e unboxing se baseia na exibio unificada do C# do sistema do tipo no qual um valor de qualquer tipo pode ser
tratado como objeto.

No exemplo a seguir, a varivel inteira i encapsulada e atribuda ao objeto o .

C#

inti=123;
//Thefollowinglineboxesi.
objecto=i;

O objeto o pode ento ser unboxed e atribudo varivel inteira i :

C#

o=123;
i=(int)o;//unboxing

Os exemplos a seguir ilustram como boxing usado no C#.

C#

https://msdn.microsoft.com/ptbr/library/yz2be5wk(d=printer).aspx 1/7
22/02/2017 Conversesboxingeunboxing(GuiadeProgramaoemC#)

//String.Concatexample.
//String.Concathasmanyversions.Restthemousepointeron
//Concatinthefollowingstatementtoverifythattheversion
//thatisusedheretakesthreeobjectarguments.Both42and
//truemustbeboxed.
Console.WriteLine(String.Concat("Answer",42,true));

//Listexample.
//Createalistofobjectstoholdaheterogeneouscollection
//ofelements.
List<object>mixedList=newList<object>();

//Addastringelementtothelist.
mixedList.Add("FirstGroup:");

//Addsomeintegerstothelist.
for(intj=1;j<5;j++)
{
//Restthemousepointeroverjtoverifythatyouareadding
//aninttoalistofobjects.Eachelementjisboxedwhen
//youaddjtomixedList.
mixedList.Add(j);
}

//Addanotherstringandmoreintegers.
mixedList.Add("SecondGroup:");
for(intj=5;j<10;j++)
{
mixedList.Add(j);
}

//Displaytheelementsinthelist.Declaretheloopvariableby
//usingvar,sothatthecompilerassignsitstype.
foreach(variteminmixedList)
{
//Restthemousepointeroveritemtoverifythattheelements
//ofmixedListareobjects.
Console.WriteLine(item);
}

//Thefollowingloopsumsthesquaresofthefirstgroupofboxed
//integersinmixedList.Thelistelementsareobjects,andcannot
//bemultipliedoraddedtothesumuntiltheyareunboxed.The
//unboxingmustbedoneexplicitly.
varsum=0;
for(varj=1;j<5;j++)
{
//Thefollowingstatementcausesacompilererror:Operator
//'*'cannotbeappliedtooperandsoftype'object'and
//'object'.
//sum+=mixedList[j]*mixedList[j]);

//Afterthelistelementsareunboxed,thecomputationdoes
//notcauseacompilererror.
sum+=(int)mixedList[j]*(int)mixedList[j];
}
https://msdn.microsoft.com/ptbr/library/yz2be5wk(d=printer).aspx 2/7
22/02/2017 Conversesboxingeunboxing(GuiadeProgramaoemC#)

//Thesumdisplayedis30,thesumof1+4+9+16.
Console.WriteLine("Sum:"+sum);

//Output:
//Answer42True
//FirstGroup:
//1
//2
//3
//4
//SecondGroup:
//5
//6
//7
//8
//9
//Sum:30

Desempenho
Com relao s atribuies simples, boxing e unboxing so processos computacionalmente caros. Quando um tipo de valor
convertido, um novo objeto deve ser alocado e criado. Em menor grau, a converso exigida unboxing tambm cara
computacionalmente. Para obter mais informaes, consulte Desempenho https://msdn.microsoft.com/pt
br/library/ms173196.aspx.

Boxing
O encapsulamento usado para armazenar tipos de valor na heap do lixo coletado. O encapsulamento uma converso
implcita de um tipo de valor https://msdn.microsoft.com/ptbr/library/s1ax56ch.aspx para o tipo object ou para qualquer
tipo de interface implementado por este tipo de valor. Encapsular um tipo de valor atribui uma instncia de objeto na heap e
copia o valor para o novo objeto.

Considere a seguinte declarao de uma varivel do tipo de valor:

C#

inti=123;

A instruo a seguir aplica implicitamente a operao de boxing na varivel i :

C#

//Boxingcopiesthevalueofiintoobjecto.
objecto=i;

https://msdn.microsoft.com/ptbr/library/yz2be5wk(d=printer).aspx 3/7
22/02/2017 Conversesboxingeunboxing(GuiadeProgramaoemC#)

O resultado dessa instruo a criao de um o de referncia do objeto na pilha que faz referncia a um valor no tipo int ,
no heap. Esse valor uma cpia do valor do tipo de valor atribudo a i varivel. A diferena entre duas variveis, i e o ,
ilustrada na figura a seguir.

Converso de boxing

Tambm possvel executar o encapsulamento explicitamente como no exemplo a seguir, mas o encapsulamento explcito
nunca necessrio:

C#

inti=123;
objecto=(object)i;//explicitboxing

Descrio
Este exemplo converte uma varivel inteiro i a um objeto o usando o boxing. Em seguida, o valor armazenado na varivel
i alterado de 123 a 456 . O exemplo mostra esse tipo de valor original e o uso do objeto disponvel usam locais de
memria diferentes, portanto podem armazenar valores diferentes.

Exemplo

C#

https://msdn.microsoft.com/ptbr/library/yz2be5wk(d=printer).aspx 4/7
22/02/2017 Conversesboxingeunboxing(GuiadeProgramaoemC#)

classTestBoxing
{
staticvoidMain()
{
inti=123;

//Boxingcopiesthevalueofiintoobjecto.
objecto=i;

//Changethevalueofi.
i=456;

//Thechangeinidoesnoteffectthevaluestoredino.
System.Console.WriteLine("Thevaluetypevalue={0}",i);
System.Console.WriteLine("Theobjecttypevalue={0}",o);
}
}
/*Output:
Thevaluetypevalue=456
Theobjecttypevalue=123
*/

Unboxing
O unboxing uma converso explcita do tipo object para um tipo de valor https://msdn.microsoft.com/pt
br/library/s1ax56ch.aspx ou de um tipo da interface para um tipo de valor que implementa a interface. Uma operao
unboxing consiste de:

Verificando a instncia de objeto para certificarse que um valor convertido do tipo de valor dado.

Copiando o valor da instncia na varivel do tipo de valor.

AS instrues a seguir demonstram as operaes de boxing e unboxing:

C#

inti=123;//avaluetype
objecto=i;//boxing
intj=(int)o;//unboxing

A figura a seguir mostra o resultado das instrues anteriores.

https://msdn.microsoft.com/ptbr/library/yz2be5wk(d=printer).aspx 5/7
22/02/2017 Conversesboxingeunboxing(GuiadeProgramaoemC#)

Converso de unboxing

Para unboxing de tipos de valores a serem sucedidos em tempo de execuo, o item que est sendo unboxed deve ser uma
referncia a um objeto criado anteriormente por meio de boxing de uma instncia desse tipo de valor. Tentar desencapsular
null causar um NullReferenceException https://msdn.microsoft.com/ptbr/library/system.nullreferenceexception.aspx.
Tentar desencapsular uma referncia para um tipo de valor incompatvel causar um InvalidCastException
https://msdn.microsoft.com/ptbr/library/system.invalidcastexception.aspx.

Exemplo
O exemplo a seguir demonstra um caso de unboxing invlido e InvalidCastException resultante. Usando try e catch ,
uma mensagem de erro exibida quando o erro ocorre.

C#

classTestUnboxing
{
staticvoidMain()
{
inti=123;
objecto=i;//implicitboxing

try
{
intj=(short)o;//attempttounbox

System.Console.WriteLine("UnboxingOK.");
}
catch(System.InvalidCastExceptione)
{
System.Console.WriteLine("{0}Error:Incorrectunboxing.",e.Message);
}
}
}

Sada do programa:

Specifiedcastisnotvalid.Error:Incorrectunboxing.

Se voc alterar a instruo:

https://msdn.microsoft.com/ptbr/library/yz2be5wk(d=printer).aspx 6/7
22/02/2017 Conversesboxingeunboxing(GuiadeProgramaoemC#)

intj=(short)o;

at:

intj=(int)o;

a converso ser executada, e voc receber a sada:

UnboxingOK.

Especificao da Linguagem C#
Para obter mais informaes, consulte a Especificao da linguagem C# https://msdn.microsoft.com/pt
br/library/ms228593.aspx. A especificao da linguagem a fonte definitiva para a sintaxe e o uso de C#.

Sees relacionadas
Para obter mais informaes:

Tipos de referncia https://msdn.microsoft.com/ptbr/library/490f96s2.aspx

Tipos de valor https://msdn.microsoft.com/ptbr/library/s1ax56ch.aspx

Especificao da Linguagem C#
Para obter mais informaes, consulte a Especificao da linguagem C# https://msdn.microsoft.com/pt
br/library/ms228593.aspx. A especificao da linguagem a fonte definitiva para a sintaxe e o uso de C#.

Consulte tambm
Guia de Programao em C# https://msdn.microsoft.com/ptbr/library/67ef8sbd.aspx

2017 Microsoft

https://msdn.microsoft.com/ptbr/library/yz2be5wk(d=printer).aspx 7/7

S-ar putea să vă placă și