Hoekom noem 'n paar funksies van die objekklas, op 'n primitiewe soort geval, behoefte boks?
-
24-09-2019 - |
Vra
Ek het ontdek dat as ek hardloop volgende reëls van die kode.
int i = 7;
i.GetHashCode(); //where GetHashCode() is the derived
//function from System.Object
Geen boks is gedoen, maar as ek i.GetType()
noem ( 'n ander afgelei funksie van System.Object
) in plaas van GetHashCode()
, sal 'n boks verwag word om oproep GetType()
Waarom sy nie moontlik om GetType()
op primitiewe tipe instansie direk bel, sonder boks, terwyl sy moontlik om GetHashCode()
noem sonder boks?
Oplossing
Die sleutel hier is dat GetType()
is nie virtuele en kan nie oorskryf word. Sedert 'n struct is effektief sealed
, kan metodes nie oorheers enige meer as die struct, so die runtime en samesteller struct metodes wat geïgnoreer gewees het as statiese oproepe kan hanteer.
As jy 'n struct (rare) skryf jy moet ignoreer al die metodes soos ToString()
, Equals()
, GetHashCode()
vir presies hierdie rede. As jy dit nie doen nie, moet boks. Maar GetType()
kan nie oorheers, moet dus boks.
Dit eintlik lei tot 'n paar vreemde rand-gevalle met Nullable<T>
en boks, aangesien 'n leë Nullable<T>
bokse te null
, so:
int i = obj.GetHashCode(); // fine
Type t = obj.GetType(); // boom
Ander wenke
Ek dink die rede hiervoor is dat GetHashCode geïmplementeer op System.Int32 direk, bel jy System.Int32 :: GetHashCode (). Jy hoef nie te boks as jy 'n bekende lid funksie 'n beroep op 'n waarde tipe.
Lyk baie naby aan Hoe is ValueType.GetType () in staat is om die tipe van die struct ?
bepaalOok met betrekking getSoort en TypeOf verwarring