Perché chiamare alcune funzioni della classe Object, su un'istanza di tipo primitivo, necessità di pugilato?

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

  •  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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top