El boxeo/unboxing se produce cuando se pasa un tipo de valor (como una estructura, int, largo) en algún lugar que acepta un tipo de referencia, como object
.
Esto ocurre cuando se crea explícitamente un método que toma parámetros de tipo objeto que se pasarán tipos de valores. También aparece cuando utiliza las colecciones antiguas no genéricas para almacenar tipos de valores (típicamente primitivos).
También verá el boxeo cuando usa String.Format()
y le transfiere las primitivas. Esto se debe a que String.Format()
acepta un objeto params [], lo que da como resultado el encajamiento de los parámetros adicionales en la llamada.
El uso de la reflexión para invocar métodos también puede dar como resultado boxing/unboxing, porque las API de reflexión no tienen otra opción que devolver object
ya que el tipo real no se conoce en tiempo de compilación (y las Reflection API no pueden ser genéricas).
Las colecciones genéricas más nuevas no dan como resultado el boxeo/unboxing, por lo que son preferibles a las colecciones más antiguas por este motivo (por ejemplo, ArrayList, Hashtable, etc.). Sin mencionar que son seguros de tipo.
Puede evitar las preocupaciones del boxeo cambiando los métodos que aceptan objetos para ser genéricos. Por ejemplo:
public void string Decorate(object a) // passing a value type results in boxing
{
return a.ToString() + " Some other value";
}
vs:
public void string Decorate<T>(T a)
{
return a.ToString() + " some other value";
}
Estoy de acuerdo con usted. De todo lo que he leído sobre el tema, simplemente no entiendo el punto. Debe faltar algo :) –