Perché chiamare alcune funzioni della classe Object, su un'istanza di tipo primitivo, necessità di pugilato?
-
24-09-2019 - |
Domanda
ho scoperto che se corro seguenti righe di codice.
int i = 7;
i.GetHashCode(); //where GetHashCode() is the derived
//function from System.Object
Non boxe è fatto, ma se chiamo i.GetType()
(un'altra funzione derivata da System.Object
) al posto di GetHashCode()
, un incontro di boxe sarà richiesto di chiamata GetType()
, perché la sua non è possibile chiamare GetType()
su istanza del tipo primitivo direttamente, senza la boxe, mentre la sua possibile chiamare GetHashCode()
senza la boxe?
Soluzione
La chiave qui è che GetType()
non è virtuale e non può essere ignorata. Dal momento che una struct è effettivamente sealed
, metodi non può essere ignorato qualsiasi più rispetto alla struct, in modo che il runtime e compilatore in grado di trattare i metodi struct che sono stato uno scostamento le chiamate statiche.
Se si scrive una struct (rara) si dovrebbe la priorità su tutti i metodi come ToString()
, Equals()
, GetHashCode()
proprio per questo motivo. Se non si deve scatola. Tuttavia, GetType()
non possono essere ignorato, deve quindi boxe.
Questo in realtà porta ad alcune strane edge-casi con Nullable<T>
e la boxe, dal momento che un vuoto scatole Nullable<T>
a null
, quindi:
int i = obj.GetHashCode(); // fine
Type t = obj.GetType(); // boom
Altri suggerimenti
Credo che il motivo è che GetHashCode è implementato su System.Int32 direttamente, si chiama System.Int32 :: GetHashCode (). Non c'è bisogno di dialogo se si chiama una funzione di membro conosciuto su un tipo di valore.
Sembra molto vicino a Come è ValueType.GetType () in grado di determinare il tipo di struct ?
Anche relativo è GetType e TypeOf confusione