InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
Tutorial C#
Introduccion a C#
Programacion con C#
Fundamentos de C#
Operadores
Instrucciones
Estrcuturas de control.
Definición de clases
Creación de objetos
Herencia y métodos virtuales
Polimorfismo
Ocultación de miembros
Miembros de tipo
Encapsulación
Espacios de nombres
Importación de espacios de nombres
Espacio de nombres distribuidos
Variables y tipos de datos
Tablas unidimensionales
Tablas multidimensionales
La clase System.Array
Cadenas de texto
Constantes
Orden de inicialización de variables
Métodos
Métodos externos
Constructores
Destructores
Propiedades
Indizadores
Redefinición de operadores
Delegados y eventos
La clase MulticastDelegate
Llamadas asíncronas
Implementación interna de los delegados
Eventos
Estructuras
Boxing y unboxing
Constructores de estructuras
Enumeraciones
Interfaces
Excepciones
Otras instrucciones
Atributos
Definición de nuevos atributos
Lectura de atributos en tiempo de ejecución
Atributos de compilación
Pseudoatributos
Código inseguro
Definición de punteros
Manipulación de punteros
Operadores relacionados con código inseguro
Fijación de variables apuntadas
Novedades de C# 2.0
Genéricos
Tipos parciales
Iteradores
Mejoras en la manipulación de delegados
Tipos anulables
Modificadores de visibilidad de bloques get y set
Clases estáticas
Referencias a espacios de nombres
Supresión temporal de avisos
Atributos condicionales
Incrustación de tablas en estructuras
Modificaciones en el compilador
También puedes ver ...
SubVersion y Visual Studio
Encriptación con AES Rijndael - Ejemplo
TripleDES - Un ejemplo practico en C#
Insertar una marca de agua en documentos PDF
Serialización: XmlSerializer y BinaryFormater
Handler para manipular imagenes
Conversiones de tipos personalizadas (VB y C#)
Compresión por gzip y deflate
La página Web que está abriendo contiene tanto elementos seguros como no seguros.
Cómo insertar un fichero .xml en un campo de tipo XML de SQL server 2005 o 2008


Boxing y unboxing

    Dado que toda estructura deriva de System.Object, ha de ser posible a través del      polimorfismo almacenar objetos de estos tipos en objetos object. Sin embargo, esto no puede hacerse directamente debido a las diferencias semánticas y de almacenamiento que existen entre clases y estructuras: un object siempre ha de almacenar una referencia a un objeto en memoria dinámica y una estructura no tiene porqué estarlo. Por ello ha de realizársele antes al objeto de tipo valor una conversión conocida como boxing. Recíprocamente, al proceso de conversión de un object que contenga un objeto de un tipo valor al tipo valor original se le denomina unboxing.

    El proceso de boxing es muy sencillo. Consiste en envolver el objeto de tipo valor en un objeto de un tipo referencia creado específicamente para ello. Por ejemplo, para un objeto de un tipo valor T, el tipo referencia creado sería de la forma:


class T_Box
{
 T value;
 T_Box(T t)
 {
  value = t;
 }
}

    En realidad todo esto ocurre de forma transparente al programador, el cual simplemente asigna el objeto de tipo valor a un objeto de tipo referencia como si de cualquier asignación polimórfica se tratase. Por ejemplo:


  int p = new Punto(10,10);
  object o = p; // boxing. Es equivalente a object o = new Punto_Box(p);

    En realidad la clase envoltorio arriba escrita no se crea nunca, pero conceptualmente es como si se crease. Esto se puede comprobar viendo a través del siguiente código que el verdadero tipo del objeto o del ejemplo anterior sigue siendo Punto (y no  Punto_Box):


Console.WriteLine((p is Punto));

    La salida por pantalla de este código es True, lo que confirma que se sigue considerando que en realidad p almacena un Punto (recuérdese que el operador is sólo devuelve true si el objeto que se le pasa como operando izquierdo es del tipo que se le indica como operando derecho)

    El proceso de unboxing es también transparente al programador. Por ejemplo, para recuperar como Punto el valor de tipo Punto almacenado en el objeto o anterior se haría:


p = (Punto) o;  // Es equivalente a ((Punto_Box) o).value

    Obviamente durante el unboxing se hará una comprobación de tipo para asegurar que el objeto almacenado en o es realmente de tipo Punto. Esta comprobación es tan estricta que se ha de cumplir que el tipo especificado sea exactamente el mismo que el tipo original del objeto, no vale que sea un compatible. Por tanto, este código es inválido:


int i = 123;
object o = i;
long l = (long) o // Error: o contiene un int, no un long

    Sin embargo, lo que si sería válido es hacer:


long l = (long) (int) o;

    Como se puede apreciar en el constructor del tipo envoltorio creado, durante el boxing el envoltorio que se crea recibe una copia del valor del objeto a convertir, por lo que los cambios que se le hagan no afectarán al objeto original. Por ello, la salida del siguiente código será 10:


Punto p = new Punto(10,10);
object o = p;                      // boxing
p.X = 100;
Console.WriteLine( ((Punto) o).X); // unboxing

    Sin embargo, si Punto se hubiese definido como una clase entonces sí que se mostraría por pantalla un 100 ya que entonces no se haría boxing en la asignación de p a o sino que se aplicaría el mecanismo de polimorfismo normal, que consiste en tratar p a través de o como si fuese de tipo object pero sin realizarse ninguna conversión.

     El problema del boxing y el  unboxing es que son procesos lentos, ya que implican la creación y destrucción de objetos envoltorio. Por ello puede interesar evitarlos en aquellas situaciones donde la velocidad de ejecución de la aplicación sea crítica, y para ello se proponen varias técnicas:

  • Si el problema se debe al paso de estructuras como parámetros de métodos genéricos que tomen parámetros de tipo object, puede convenir definir sobrecargas de esos métodos que en lugar de tomar objects tomen objetos de los tipos estructura que en concreto la aplicación utiliza

    A partir de la versión 2.0 de C#, se pueden utilizar las denominadas plantillas o genéricos, que no son más que definiciones de tipos de datos en las que no se indica cuál es el tipo exacto de ciertas variables sino que se deja en función de parámetros a los que puede dárseles distintos valores al crear cada  objeto de ese tipo. Así, en vez de crearse objetos con métodos que tomen parámetros object, se podrían ir creando diferentes versiones del tipo según la estructura con la se vaya a trabajar. El Tema 21: Novedades de C# 2.0 explica esto más detalladamente.

  • Muchas veces conviene hacer unboxing para poder acceder a miembros específicos de ciertas estructuras almacenadas en objects, aunque a continuación vuelva a necesitarse realmacenar la estructura en un object. Para evitar esto una posibilidad sería almacenar en el objecto no directamente la estructura sino un objeto de una clase envolvente creada a medida por el programador y que incluya los miembros necesarios para hacer las operaciones anteriores. Así se evitaría tener que hacer unboxing, pues se convertiría de object a esa clase, que no es un tipo valor y por tanto no implica unboxing.

  • Con la misma idea, otra posibilidad sería que el tipo estructura implementase ciertas interfaces mediante las que se pudiese hacer las operaciones antes comentadas. Aunque las interfaces no se tratarán hasta el Tema 15: Interfaces, por ahora basta saber que las interfaces son también tipos referencia y por tanto convertir de object a un tipo interfaz no implica unboxing.

Inicio | Tutorial C# EstructurasTutorial C#Constructores de estructuras Versión para imprimir Foros de consulta


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



Inicio | Tutorial C# EstructurasTutorial C#Constructores de estructuras Versión para imprimir

Boxing y unboxing
Autor: José Antonio González Seco
Visitas: 10633 Fecha de publicación: 29/10/2006
José Antonio es experto en tecnologias Microsoft. Imparte cursos y conferencias en congresos sobre C# y .NET en Universidades de toda España (Sevilla, Barcelona, San Sebastián, Valencia, Oviedo, etc.) en representación de grandes empresas como Microsoft.




Visitas: 81 | Comentarios: 2 | Archivo: Articulos
02/02/2010 iPad vs Telesketch
Visitas: 786 | Comentarios: 2 | Archivo: Articulos
Categorias: Humor
Visitas: 725 | Comentarios: 3 | Archivo: Articulos
Visitas: 3116 | Comentarios: 2 | Archivo: Articulos
Categorias: C#
Visitas: 14470 | Comentarios: 7 | Archivo: Articulos
Categorias: C#|Seguridad
Visitas: 1462 | Comentarios: 3 | Archivo: Articulos
Visitas: 688 | Comentarios: 2 | Archivo: Articulos
Visitas: 367 | Comentarios: 0 | Archivo: Articulos
Visitas: 1983 | Comentarios: 2 | Archivo: Articulos
Categorias: C#

Útimos temas recibidos en los foros ...
certificado de afiliación de pensiones y cesantias por secre ... [Actualidad] 107 28/01/2010
Certificadoo por Francy ... [Actualidad] 0 10/03/2010
FORMULARIO ACCESS por jcifuentes ... [Access] 34 29/05/2007
certificado de pensiones del bbva horizonte por danger ... [Actualidad] 119 12/01/2010
Certificado por Francy ... [Actualidad] 0 10/03/2010
certificado de pensión y ses antias por hernan ... [Actualidad] 0 10/03/2010
Certificado de Penciones Horizonte por orlandossa ... [Actualidad] 4 09/02/2010
fondo de pensiones por mafe ... [Access] 0 10/03/2010
certificado del fondo de pensiones cc 10.491.465 santander de Q. por carlos andres cifuentes banguero ... [Actualidad] 9 17/02/2010
certificado de semanas cotisadaz por lis ... [Actualidad] 0 10/03/2010
certificado por arme ... [Actualidad] 0 10/03/2010
Quiero saber a que fondo de pensiones estoy afiliada por clau ... [Actualidad] 169 24/07/2009

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
22/10/2005 Actualización de datos. UPDATE    forma parte de...Tutorial SQL
21/02/2007 Subconsultas    forma parte de...Tutorial SQL
28/07/2007 Drivers y Plugins para conectar mySQL con Visual Studio y .net
13/04/2008 String.Format
23/05/2006 Cursores en PL/SQL    forma parte de...Tutorial PL/SQL
09/10/2006 Variables y tipos de datos    forma parte de...Tutorial C#
22/10/2005 Componentes del lenguaje SQL    forma parte de...Tutorial SQL
13/01/2007 Atributos condicionales    forma parte de...Tutorial C#
01/01/2006 Consultas agregadas    forma parte de...Tutorial SQL
19/10/2006 Llamadas asíncronas    forma parte de...Tutorial C#

 

Encuesta
¿A que perfil te adaptas mejor?




[Ver] [Votar]