Conversión Boxing
Conversión Boxing
Conversión Boxing
http://msdn.microsoft.com/es-es/library/yz2be5wk(d=printer).aspx
Este artculo se tradujo de forma manual. Mueva el puntero sobre las frases del artculo para ver el texto original. Ms informacin.
Traduccin
Original
La conversin boxing es el proceso de convertir un tipo de valor en el tipo object o en cualquier tipo de interfaz implementada por ese tipo de valor. Cuando CLR aplica la conversin boxing a un tipo de valor, ajusta el valor dentro de una clase System.Object y lo almacena en el montn administrado. La conversin unboxing extrae el tipo de valor del objeto. La conversin boxing es implcita y la conversin unboxing es explcita. El concepto de conversin boxing y unboxing es la base de la vista unificada del sistema de tipos de C#, en el que un valor de cualquier tipo se puede tratar como objeto. En el ejemplo siguiente, se aplica la conversin boxing a la variable de entero i y esta se asigna al objeto o. C#
o=123; i=(int)o;//unboxing
1 de 7
http://msdn.microsoft.com/es-es/library/yz2be5wk(d=printer).aspx
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]; } //Thesumdisplayedis30,thesumof1+4+9+16. Console.WriteLine("Sum:"+sum); //Output: //Answer42True //FirstGroup: //1 //2 //3 //4 //SecondGroup:
2 de 7
http://msdn.microsoft.com/es-es/library/yz2be5wk(d=printer).aspx
Con relacin a las asignaciones simples, las conversiones boxing y unboxing son procesos que consumen muchos recursos. Cuando se aplica la conversin boxing a un tipo de valor, se debe asignar y construir un objeto completamente nuevo. En menor grado, la conversin de tipos requerida para aplicar la conversin unboxing tambin es costosa. Para obtener ms informacin, vea Rendimiento.
La conversin boxing se utiliza para almacenar tipos de valor en el montn de recoleccin de elementos no utilizados. La conversin boxing es una conversin implcita de un tipo de valor al tipo object o a cualquier tipo de interfaz implementada por este tipo de valor. Al aplicar la conversin boxing a un tipo de valor se asigna una instancia de objeto en el montn y se copia el valor en el nuevo objeto. Considere la siguiente declaracin de una variable de tipo de valor: C#
inti=123;
//Boxingcopiesthevalueofiintoobjecto. objecto=i;
El resultado de esta instruccin es crear una referencia de objeto o en la pila que hace referencia a un valor del tipo int en el montn. Este valor es una copia del tipo de valor asignado a la variable i. La diferencia entre las dos variables, i y o, se muestra en la figura siguiente. Conversin boxing
3 de 7
http://msdn.microsoft.com/es-es/library/yz2be5wk(d=printer).aspx
Tambin es posible realizar la conversin boxing de manera explcita, tal como se muestra en el ejemplo siguiente, pero esta nunca es necesaria: C#
inti=123; objecto=(object)i;//explicitboxing
Este ejemplo convierte una variable de entero i en un objeto o mediante la conversin boxing. A continuacin, el valor almacenado en la variable i se cambia de 123 a 456. El ejemplo muestra que el tipo de valor original y el objeto al que se ha aplicado la conversin boxing usan ubicaciones de memoria independientes y, por consiguiente, pueden almacenar valores diferentes.
C#
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
4 de 7
http://msdn.microsoft.com/es-es/library/yz2be5wk(d=printer).aspx
Theobjecttypevalue=123 */
El ejemplo siguiente muestra un caso de conversin unboxing no vlida y la excepcin InvalidCastException resultante. Si se utiliza try y catch, se muestra un mensaje de error cuando se produce el error. C#
intj=(short)o; a:
5 de 7
http://msdn.microsoft.com/es-es/library/yz2be5wk(d=printer).aspx
La conversin unboxing es una conversin explcita del tipo object a un tipo de valor o de un tipo de interfaz a un tipo de valor que implementa la interfaz. Una operacin de conversin unboxing consiste en lo siguiente: Comprobar la instancia de objeto para asegurarse de que se trata de un valor de conversin boxing del tipo de valor dado. Copiar el valor de la instancia en la variable de tipo de valor. Las siguientes instrucciones muestran las operaciones de conversin boxing y unboxing: C#
Para que la conversin unboxing de tipos de valor sea correcta en tiempo de ejecucin, el elemento al que se aplica debe ser una referencia a un objeto creado previamente mediante la conversin boxing de una instancia de ese tipo de valor. Si se intenta aplicar la conversin unboxing a null, se producir una excepcin NullReferenceException. Si se intenta aplicar la conversin unboxing a una referencia de un tipo de valor incompatible, se producir una excepcin InvalidCastException.
Para obtener ms informacin, vea la Especificacin del lenguaje C#. La especificacin del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.
6 de 7
http://msdn.microsoft.com/es-es/library/yz2be5wk(d=printer).aspx
Para obtener ms informacin, vea la Especificacin del lenguaje C#. La especificacin del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.
Adiciones de comunidad
2014 Microsoft. Reservados todos los derechos.
7 de 7