Estoy buscando una manera clara, concisa y precisa respuesta.

Lo ideal sería como la respuesta real, a pesar de enlaces a buenas explicaciones de la recepción.

  • Es esto realmente independientes del lenguaje?
  • ciertamente no específicos del idioma, aunque también no es relevante para todos los idiomas – la distinción será irrelevante para la mayoría de los dinámicamente tipado de idiomas, por ejemplo. No estoy seguro de lo de la etiqueta podría ser utilizado en lugar de – language-but-not-type-agnostic? static-language-agnostic? No estoy seguro de que debe, por tanto, la distinción; podría ser una buena pregunta para el meta, aunque.
InformationsquelleAutor Keith | 2008-08-16

8 Comentarios

  1. 180

    En caja de valores estructuras de datos que son mínimos contenedores de los tipos primitivos*. En caja de valores se almacenan normalmente como punteros a objetos en el montón.

    Por lo tanto, en caja de valores de uso de más memoria y tomar el mínimo de la memoria en dos búsquedas de acceso: una vez para obtener el puntero, y a otros a seguir ese puntero a la primitiva. Obviamente este no es el tipo de cosa que usted desea en su interior de los bucles. Por otro lado, en caja de valores suelen jugar mejor con otros tipos en el sistema. Ya que son de primera clase de estructuras de datos en el idioma, tienen la espera de metadatos y la estructura que otras estructuras de datos tienen.

    En Java y Haskell colecciones genéricas no pueden contener sin caja de valores. Colecciones genéricas en .NET puede sostener sin embalaje valores sin sanciones. Donde Java generics sólo se utilizan en tiempo de compilación, la comprobación de tipos .RED generar clases específicas para cada tipo genérico de una instancia en tiempo de ejecución.

    Java y Haskell tiene sin embalaje matrices, pero son claramente menos cómodo que el de otras colecciones. Sin embargo, cuando el máximo rendimiento es necesario que la pena un poco de molestias para evitar la sobrecarga de boxing y unboxing.

    * Para este análisis, un valor primitivo es cualquiera que pueda ser almacenado en la pila de llamadas, en lugar de almacenarse como un puntero a un valor en la pila. Con frecuencia que sólo los tipos de máquina (enteros, flotantes, etc), structs, y a veces estático del tamaño de las matrices. .NET-tierra les llama tipos de valor (como contraposición a los tipos de referencia). Java gente les llame tipos primitivos. Haskellions simplemente llame a ellos sin caja.

    ** Me estoy concentrando en Java, Haskell, y C# en esta respuesta, porque eso es lo que yo sé. Para lo que vale, Python, Ruby y Javascript, todos tienen exclusivamente en caja de valores. Esto también es conocido como el «Todo es un objeto» enfoque***.

    *** Advertencia: Un avanzado lo suficiente como compilador /JIT en algunos casos puede detectar que un valor que es semánticamente caja cuando se mira en la fuente, puede ser un sin embalaje valor en tiempo de ejecución. En esencia, gracias a un brillante lenguaje de los ejecutores de sus cuadros son a veces gratis.

    • Por qué a pesar de una caja de valor, ¿qué ventajas ofrece el CLR o lo que sea obtener el formulario de boxeo de valores?
    • En corto (ja, ja), son sólo otro Objeto, que es muy cómodo. Primitivas (en Java de al menos) no descienden de Objeto, no puede tener campos, no puede tener métodos, y en general se comportan de manera muy diferente de otros tipos de valores. Por otro lado, trabajar con ellos puede ser muy rápido y eficiencia de espacio. Por lo tanto el comercio.
    • Javascript ha llamado matrices (nueva UInt32Array etc) que son matrices de enteros sin embalaje y carrozas.
  2. 68

    De boxeo & unboxing es el proceso de convertir un valor primitivo en un objeto orientado a la clase de contenedor (boxeo), o la conversión de un valor de un objeto orientado a la clase de contenedor de vuelta a la primitiva valor (unboxing).

    Por ejemplo, en java, usted puede necesitar para convertir un int valor en un Integer (boxeo) si desea almacenar en un Collection porque primitivas no se puede almacenar en un Collection, sólo los objetos. Pero cuando se quiere obtener de ella hacia fuera de la Collection usted lo desea, puede obtener el valor como una int y no un Integer así que unbox ella.

    Boxing y unboxing no es inherentemente mal, pero es una cuestión de equilibrio. Dependiendo de la implementación del lenguaje, puede ser más lento y más intensivo de memoria que la utilización de primitivas. Sin embargo, también puede permitir que usted utilice más alto nivel de las estructuras de datos y lograr una mayor flexibilidad en el código.

    Estos días, es más comúnmente discutidos en el contexto de Java (y otras de la lengua) «autoboxing/autounboxing» característica. Aquí está una java centrada en la explicación de autoboxing.

  3. 23

    En .Net:

    A menudo no se puede confiar en lo que el tipo de variable de una función se consumen, por lo que necesita utilizar una variable de objeto que se extiende desde el mínimo común denominador – en .Neta esto es object.

    Sin embargo object es una clase y almacena sus contenidos como referencia.

    List<int> notBoxed = new List<int> { 1, 2, 3 };
    int i = notBoxed[1]; //this is the actual value
    
    List<object> boxed = new List<object> { 1, 2, 3 };
    int j = (int) boxed[1]; //this is an object that can be 'unboxed' to an int
    

    Mientras tanto estos tienen la misma información de la segunda lista es más grande y más lento. Cada valor en la segunda lista es en realidad una referencia a un object que tiene el int.

    Esto se llama caja porque la int es envuelto por la object. Cuando su elenco de vuelta el int es sin caja – convierte de nuevo a su valor.

    Los tipos de valor (es decir, todos structs) esto es lento, y potencialmente mucho más espacio.

    Para los tipos de referencia (es decir, todos classes) este es un problema mucho menos, ya que se almacenan como una referencia de todos modos.

    Un problema con una caja de tipo de valor es que no es obvio que usted está tratando con la caja, en lugar del valor. Cuando se comparan dos structs entonces usted está comparando los valores, pero cuando se comparan dos classes entonces (por defecto) usted está comparando con el de referencia, es decir, son estos la misma instancia?

    Esto puede ser confuso cuando se trata con caja de tipos de valor:

    int a = 7;
    int b = 7;
    
    if(a == b) //Evaluates to true, because a and b have the same value
    
    object c = (object) 7;
    object d = (object) 7;
    
    if(c == d) //Evaluates to false, because c and d are different instances
    

    Es fácil de evitar:

    if(c.Equals(d)) //Evaluates to true because it calls the underlying int's equals
    
    if(((int) c) == ((int) d)) //Evaluates to true once the values are cast
    

    Sin embargo es otra cosa que tener cuidado cuando se trata con en caja de valores.

    • En vb.net la distinción entre semántica es más clara, Object no aplicar el operador de igualdad, sino de la clase de tipos puede ser comparado con el Is operador; por el contrario, Int32 se puede utilizar con el operador de igualdad, pero no Is. Esa distinción la hace mucho más clara de qué tipo de comparación que se hace.
  4. 3

    El .NET FCL colecciones genéricas:

    List<T>
    Dictionary<TKey, UValue>
    SortedDictionary<TKey, UValue>
    Stack<T>
    Queue<T>
    LinkedList<T>
    

    fueron diseñadas para superar los problemas de rendimiento de boxing y unboxing en anteriores implementaciones de colección.

    Para obtener más información, consulte el capítulo 16, CLR a través de C# (2ª Edición).

  5. 2

    El boxeo es el proceso de conversión de un tipo de valor en un tipo de referencia.

    Unboxing es la conversión de un tipo de referencia a un tipo de valor.

    EX: int i=123;
        object o=i;//Boxing
        int j=(int)o;//UnBoxing
    

    Tipo de valor son:

    int, char y estructuras,enumeraciones.
    Tipo de referencia son:
    Las clases,interfaces,matrices,cadenas y objetos

  6. 1

    Boxing y unboxing facilita tipos de valor a ser tratadas como objetos. El boxeo es convertir un valor a una instancia del objeto tipo de referencia. Por ejemplo, Int es una clase y int es un tipo de datos. La conversión de int a Int es una ejemplificación de boxeo, mientras que la conversión de Int a int es unboxing. El concepto de ayuda en la recolección de basura, Unboxing, por otro lado, se convierte en objeto de tipo de tipo de valor.

    int i=123;
    object o=(object)i; //Boxing
    
    o=123;
    i=(int)o; //Unboxing.
    
    • En javascript, var ii = 123; typeof ii devuelve number. var iiObj = new Number(123); typeof iiObj devuelve object. typeof ii + iiObj devuelve number. Así que este es el javascript equivalente de boxeo. El valor iiObj se ha convertido automáticamente en una primitiva número (sin embalaje) con el fin de realizar la media aritmética y devolver un sin embalaje valor.
  7. -2

    Igual que cualquier otra cosa, autoboxing puede ser problemático si no se utiliza con cuidado. El clásico es acabar con un NullPointerException y no ser capaz de rastrearlo. Incluso con un depurador. Intente esto:

    public class TestAutoboxNPE
    {
        public static void main(String[] args)
        {
            Integer i = null;
    
            //.. do some other stuff and forget to initialise i
    
            i = addOne(i);           //Whoa! NPE!
        }
    
        public static int addOne(int i)
        {
            return i + 1;
        }
    }
    
    • Esto es sólo el código de malo, y no tiene nada que ver con autoboxing. La variable i prematuramente inicializado. Hacer un vacío de la declaración ( Integer i; ), de modo que el compilador puede señalar que a usted se le olvidó inicializar, o esperar a declarar hasta que usted sabe que su valor.
    • Hmm, y si tengo que hacer algo en el medio dentro de un bloque try catch, a continuación, el compilador me obligan a iniciar con algo. Este no es el código real – es un ejemplo de cómo podría suceder.
    • ¿Qué demuestra? No hay absolutamente ninguna razón para utilizar el objeto Entero. En cambio ahora tiene que lidiar con un potencial NullPointer.

Dejar respuesta

Please enter your comment!
Please enter your name here