Pourquoi appeler certaines fonctions de la classe d'objets, sur une instance de type primitif, ont besoin de boxe?

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

  •  24-09-2019
  •  | 
  •  

Question

Je l'ai découvert que si je cours suivant des lignes de code.

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

Pas de boxe est fait, mais si je l'appelle i.GetType() (une autre fonction dérivée de System.Object) à la place de GetHashCode(), une boxe sera nécessaire pour appeler GetType(), pourquoi ce ne est pas possible d'appeler GetType() sur une instance de type primitif directement, sans la boxe, tandis que son possible d'appeler sans GetHashCode() la boxe?

Était-ce utile?

La solution

La clé ici est que GetType() n'est pas virtuel et ne peut pas être surchargée. Puisqu'un struct est effectivement sealed, les méthodes ne peut être outrepassée une plus que la struct, de sorte que le temps d'exécution et le compilateur peut traiter des méthodes de struct qui ont été réinitialisée que les appels statiques.

Si vous écrivez un struct (rare) vous devrait remplacer toutes les méthodes comme ToString(), Equals(), GetHashCode() précisément pour cette raison. Si vous ne le faites pas, il faut la boîte. Cependant, GetType() ne peut pas être surchargée, a donc besoin de la boxe.

Cela conduit en fait à certains bord des cas bizarres avec Nullable<T> et la boxe, car une des boîtes de Nullable<T> vides null, donc:

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

Autres conseils

Je pense que la raison est que GetHashCode est mis en œuvre sur System.Int32, vous appelez directement System.Int32 :: GetHashCode (). Pas besoin de case si vous appelez une fonction membre connu sur un type de valeur.

Semble très proche de href="https://stackoverflow.com/questions/926352/how-is-valuetype-gettype-able-to-determine-the-type-of-the-struct"> struct?

GetType et TypeOf confusion

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top