programacion

Páginas: 6 (1441 palabras) Publicado: 10 de junio de 2013
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ámicay 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 denominaunboxing.
    El proceso de boxing es muy sencillo. Consiste en envolver el objeto de tipo valor en un objeto de un tiporeferencia 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 setratase. 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, pararecuperar 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 queel 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 copiadel 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 un100 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 interesarevitarlos 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...
Leer documento completo

Regístrate para leer el documento completo.

Estos documentos también te pueden resultar útiles

  • Programación
  • Programacion
  • Programacion
  • Programación
  • Programacion
  • Programacion
  • Programacion
  • Programacion

Conviértase en miembro formal de Buenas Tareas

INSCRÍBETE - ES GRATIS