Warum einige Funktionen des Object-Klasse aufrufen, auf einem primitiven Typ-Instanz, Notwendigkeit Boxen?

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

  •  24-09-2019
  •  | 
  •  

Frage

Ich habe entdeckt, dass, wenn ich laufe folgende Zeilen Code.

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

Keine Boxen getan wird, aber wenn ich i.GetType() nennen (eine andere abgeleitete Funktion von System.Object) anstelle von GetHashCode(), ein Box wird auf Anruf GetType() erforderlich sein, warum es nicht möglich GetType() auf primitive Typ-Instanz anzurufen, direkt ohne Boxen, während seiner möglichen GetHashCode() ohne Boxen anrufen?

War es hilfreich?

Lösung

Der Schlüssel hier ist, dass GetType() nicht virtuell ist und kann nicht außer Kraft gesetzt werden. Da eine Struktur effektiv sealed ist, können Methoden nicht außer Kraft gesetzt werden mehr als die Struktur, so dass die Laufzeit und Compiler können struct Methoden behandeln , die außer Kraft gesetzt haben als statische Anrufe.

Wenn Sie schreiben eine Struktur (selten) Sie sollte außer Kraft setzen alle Methoden wie ToString(), Equals(), GetHashCode() genau diesem Grund. Wenn Sie dies nicht tun müssen es Kasten. Allerdings GetType() kann nicht außer Kraft gesetzt werden, so braucht Boxen.

Diese tatsächlich führt zu einigen ungerade Rand-Fälle mit Nullable<T> und Boxen, da eine leere Nullable<T> Boxen null, so:

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

Andere Tipps

Ich denke, der Grund ist, dass GetHashCode auf System.Int32 direkt implementiert ist, rufen Sie System.Int32 :: GetHashCode (). wenn Sie keine Notwendigkeit, Box rufen eine bekannte Member-Funktion auf einen Wert ein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top