¿Por qué llamar a algunas funciones de la clase Object, en una instancia de tipo primitivo, necesidad de boxeo?
-
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?
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.
Parece muy cerca de Cómo es ValueType.GetType () capaz de determinar el tipo de la struct ?
También relacionado es y GetType TypeOf confusión