Ohjelmointi

Syvä sukellus: Arvo ja viitetyypit .Netissä

Microsoft .Net-tiedostotyypit voivat olla joko arvotyyppi tai viitetyyppi. Vaikka arvotyypit tallennetaan yleensä pinoon, viitetyypit tallennetaan hallittuun kasaan.

Arvotyyppi on peräisin System.ValueType-järjestelmästä ja sisältää tiedot oman muistinsa sisällä. Toisin sanoen muuttujilla tai esineillä tai arvotyypeillä on oma kopio tiedoista.

Sillä välin viitetyyppi laajentaa System.Object-kohtaa ja osoittaa muistissa olevaan sijaintiin, joka sisältää todelliset tiedot. Voit kuvitella viitetyypin, joka on samanlainen kuin osoitin, josta viitataan epäsuorasti, kun niitä käytetään. Sisäänrakennettuja viitteitä, joita C # tukee, ovat: objekti, merkkijono ja dynaaminen. Kaikki perustiedot, totuusarvot, päivämäärä, rakenteet ja yhteenvedot ovat esimerkkejä arvotyypeistä. Esimerkkejä viittaustyypeistä ovat: merkkijonot, taulukot, luokkakohteet jne. Voit luoda viitetyyppejä C #: ssä hyödyntämällä näitä avainsanoja: luokka, käyttöliittymä ja edustaja.

Huomaa, että toisin kuin viitetyyppi, et voi johtaa arvon tyypistä, etkä voi antaa nolla-arvoa suoraan arvotyypille. Voit määrittää nolla-arvon arvotyypille vain hyödyntämällä nollaamattomia tyyppejä - ominaisuus, joka lisätään .Net Frameworkin uusimpiin versioihin. Kun arvotyyppi kopioidaan toiseen, arvo kopioidaan. Siksi voit manipuloida niiden arvoja toisistaan ​​riippumatta - yhden muutos ei vaikuta toiseen. Päinvastoin, kun kopioit viitetyypin toiseen, viite kopioidaan. Jos vaihdat yhtä niistä, se vaikuttaa myös toiseen. Esimerkiksi, jos toinen viitteistä asetetaan nollaksi, myös toinen muuttuu nolliksi.

Säilytyspaikat

CLR tallentaa objektit kolmentyyppisiin tallennuspaikkoihin - rekistereihin, pinoon tai hallittuun kasaan. Vaikka lyhytaikaiset objektit tallennetaan rekistereihin tai pinoon, pitkäikäiset objektit tallennetaan kasaan. Kuten aiemmin mainitsin, arvotyypit tallennetaan yleensä pinoon.

Yleinen väärinkäsitys on, että arvotyypit tallennetaan aina pinoon. Sanoisin mieluummin, että arvotyypit voi tallennetaan pinoon, kun muuttuja on joko väliaikainen muuttuja tai paikallinen muuttuja ja JIT-kääntäjä päättää olla rekisteröimättä arvoa. Pohjimmiltaan arvotyypin todellinen sijainti riippuu JIT-kääntäjän toteutuksesta. Huomaa, että arvotyyppi voidaan tallentaa pinokehykseen, CPU-rekisteriin tai jopa kasan muistiin, jos arvotyyppi on objektin sisällä, ts. Jos se on osa viitetyyppiä. Päinvastoin, viitetyypit tallennetaan GC-kasaan. Viite tallennetaan pinoon, kun objekti varataan kasaan.

Arvotyypin esiintymät tai viitteet tallennetaan pinoon, rekisteriin tai kasaan riippuen siitä, onko ilmentymän tai viitteen elinikä lyhyt vai pitkäikäinen. Arvotyyppi voi sijaita pinossa, jos ne ovat paikallisia muuttujia, ja hallitussa kasassa, jos ne ovat luokan kenttiä, ts. Ne kuuluvat referenssityyppiin tai ovat osa sitä.

Arvon välittäminen ja viittaaminen

Seuraava koodiluettelo kuvaa, kuinka muuttuja voidaan välittää menetelmälle arvon mukaan.

 staattinen mitätön lisäys (int i)

        {

i = i + 1;

        }

staattinen void Main ()

        {

int x = 1;

Lisäys (x);

Console.WriteLine ("x: n arvo on:" + x);

Konsoli.Lue ();

        }

Huomaa, että voit välittää arvotyypin viitteeksi menetelmään käyttämällä ref-avainsanaa. Seuraava koodiluettelo kuvaa tätä.

staattinen mitätön lisäys (viite int i)

        {

i = i + 1;

        }

staattinen void Main ()

        {

int x = 1;

Lisäys (viite x);

Console.WriteLine ("x: n arvo on:" + x);

Konsoli.Lue ();

        }

Kun yllä oleva koodi suoritetaan, sanoma "x: n arvo on: 2" näkyy konsolissa.

Nyrkkeily ja purkaminen

Arvotyypin muuntaminen viitetyypiksi kutsutaan nyrkkeilyksi. Pakkauksen poistaminen on päinvastoin - se määritellään prosessina, jolla viitetyyppi muunnetaan arvotyypiksi. Seuraava koodinpätkä kuvaa nyrkkeilyä ja poistamista C #: ssä.

int i = 100;

Kohde obj = i; //Nyrkkeily

i = (int) obj; //Pakkauksen avaaminen

$config[zx-auto] not found$config[zx-overlay] not found