¿Por qué llamar a algunas funciones de la clase Object, en una instancia de tipo primitivo, necesidad de boxeo?

StackOverflow https://stackoverflow.com/questions/2179366

  •  24-09-2019
  •  | 
  •  

Pregunta

He descubierto que si corro siguientes líneas de código.

int i = 7;
i.GetHashCode(); //where GetHashCode() is the derived
                 //function from System.Object

Sin boxeo está hecho, pero si llamo i.GetType() (otra función derivada de System.Object) en lugar de GetHashCode(), se requerirá un combate de boxeo a GetType() llamada, ¿Por qué no es posible llamar GetType() en la instancia de tipo primitivo directamente, sin el boxeo, mientras que su posible llamar sin GetHashCode() boxeo?

¿Fue útil?

Solución

La clave aquí es que GetType() no es virtual y no puede ser anulado. Dado que una estructura es efectiva sealed, los métodos no se pueden sustituir cualquier más de la estructura, por lo que el tiempo de ejecución y el compilador pueden tratar métodos struct que se han anulado como llamadas estáticas.

Si se escribe una estructura (raro) que debe reemplazar todos los métodos como ToString(), Equals(), GetHashCode() exactamente por esta razón. Si no lo hace, debe caja. Sin embargo, GetType() no pueden ser anulado, por lo tanto necesita el boxeo.

En realidad, esto conduce a algunos casos de borde impares con Nullable<T> y el boxeo, ya que un vacías cajas Nullable<T> a null, así:

int i = obj.GetHashCode(); // fine
Type t = obj.GetType(); // boom

Otros consejos

Creo que la razón es que GetHashCode se implementa en System.Int32 directamente, se llama a System.Int32 :: GetHashCode (). No hay necesidad de caja si se llama a una función miembro conocido de un tipo de valor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top