Hoekom noem 'n paar funksies van die objekklas, op 'n primitiewe soort geval, behoefte boks?

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

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

Was dit nuttig?

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.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top