Documente Academic
Documente Profesional
Documente Cultură
Para obter a documentao mais recente do Visual Studio 2017 RC, consulte a documentao do Visual Studio 2017 RC
http://docs.microsoft.com/visualstudio.
C#
inti=123;
//Thefollowinglineboxesi.
objecto=i;
C#
o=123;
i=(int)o;//unboxing
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.
C#
inti=123;
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.
C#
inti=123;//avaluetype
objecto=i;//boxing
intj=(int)o;//unboxing
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.
https://msdn.microsoft.com/ptbr/library/yz2be5wk(d=printer).aspx 6/7
22/02/2017 Conversesboxingeunboxing(GuiadeProgramaoemC#)
intj=(short)o;
at:
intj=(int)o;
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:
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