2012-08-31 5 views

Respuesta

26

No, eso no es unboxing - es sólo la comprobación de si el tipo es correcto. No olvide que realmente hay un objeto involucrado, con un tipo. Comprobación de ese tipo es básicamente la misma operación con independencia de que el valor es un valor en caja tipo de valor o no. (Puede haber algunas optimizaciones factibles para tipos de valores o cualquier tipo sellado, ya que no hay herencia que considerar, pero fundamentalmente sigue comprobando la parte "tipo" de un encabezado de objeto.)

Una forma de verificar eso es recopilar el código y observe el uso de ILASM IL:

// object o = 10 
IL_0000: ldc.i4.s 10 
IL_0002: box  [mscorlib]System.Int32 
IL_0007: stloc.0 

// int i = (int) o; 
IL_0008: ldloc.0 
IL_0009: unbox.any [mscorlib]System.Int32 
IL_000e: stloc.1 

// bool isInt = o is int 
IL_000f: ldloc.0 
IL_0010: isinst  [mscorlib]System.Int32 

por lo que utiliza isinst - sin unboxing es necesario.

+2

¿Entonces el CLR puede verificar un tipo sin unboxing? –

+3

@ViacheslavSmityukh: Sí. No olvide que realmente hay un objeto involucrado, con un tipo. Verificar ese tipo es básicamente la misma operación independientemente de si el valor es un valor de tipo de valor encuadrado o no. –

+2

@JonSkeet ¿Podría editar ese comentario en la respuesta, creo que explica por qué * *, en lugar de la prueba sólo a través de IL es particularmente valioso. – Servy

5

No solo no requiere unboxing, lógicamente, no puede.

El desempaquetado puede tener éxito o fallar, dependiendo de si el objeto realmente contiene un valor del tipo que vamos a intentar desempaquetar.

Por lo tanto, unboxing requiere una verificación de si el objeto es de ese tipo en particular.

Por lo tanto, si la prueba del tipo requerido unboxing, a continuación, ya que requiere la prueba unboxing del tipo, tendríamos no ser capaz de desempacar hasta que nos gustaría primero sacó de la caja ...

Por lo tanto la prueba de un tipo pueden no requiere unboxing.

0

Como de C# 7, la palabra clave is ha ganado un nuevo caso de uso, en coincidencia de patrón como el patrón de tipo. En este caso, unboxing ocurre por ejemplo:

object o = 10; 
if (o is int i) { 
    // i is the unboxed value. 
} 

Obviamente, este es un caso distinto al puesto de original en el que únicamente se está probando el valor, como cuando se utiliza is como un patrón, en realidad se está asignando el valor. De ahí la necesidad de unbox en este caso.

Para que quede claro - nada ha cambiado en el caso original o is int - sin unboxing ocurrirá allí, según las viejas respuestas. La palabra clave is acaba de obtener un nuevo rol.

Cuestiones relacionadas