Programavimas

Gilus nardymas: reikšmės ir nuorodų tipai „.Net“

„Microsoft .Net“ tipai gali būti vertės tipas arba nuorodos tipas. Nors reikšmių tipai paprastai kaupiami rietuvėje, nuorodų tipai saugomi valdomame kaupe.

Vertės tipas kilęs iš „System.ValueType“ ir jame duomenys yra jos paties atminties paskirstyme. Kitaip tariant, kintamieji, objektai ar reikšmių tipai turi savo duomenų kopijas.

Tuo tarpu nuorodos tipas išplečia sistemą. Objektas ir nurodo vietą atmintyje, kurioje yra tikri duomenys. Galite įsivaizduoti nuorodos tipą, panašų į rodyklę, iš kurios netiesiogiai daroma nuoroda, kai ją pasiekiate. C # palaikomi integruoti nuorodų tipai yra: objektas, eilutė ir dinaminis. Visi pagrindiniai duomenų tipai, Būlio, Data, nurodymai ir išvardijimai yra vertės tipų pavyzdžiai. Nuorodų tipų pavyzdžiai: eilutės, masyvai, klasių objektai ir kt. Norėdami sukurti nuorodų tipus C #, galite pasinaudoti šiais raktiniais žodžiais: klasė, sąsaja ir delegatas.

Atminkite, kad skirtingai nei nuorodos tipas, negalite gauti iš vertės tipo ir negalite tiesiogiai priskirti nulinės vertės vertės tipui. Vertės tipui nulinę vertę galite priskirti tik pasinaudodami niekinių tipų privalumais - funkcija, pridėta prie naujesnių .Net Framework versijų. Kai vertės tipas nukopijuojamas į kitą, vertė nukopijuojama. Taigi jūs galite manipuliuoti jose esančiomis vertybėmis nepriklausomai nuo kitos - vienos pasikeitimas neturi įtakos kitai. Priešingai, nukopijuojant nuorodos tipą į kitą, nuoroda nukopijuojama. Jei pakeisite vieną iš jų, tai paveiks ir kitą. Pavyzdžiui, jei viena iš nuorodų yra nulinė, kita taip pat tampa niekinė.

Sandėliavimo vietos

CLR objektus saugo trijų tipų saugojimo vietose - registruose, kamino ar valdomo kaupo. Nors trumpalaikiai objektai yra saugomi registruose ar rietuvėse, ilgaamžiai objektai kaupiami krūvoje. Kaip jau minėjau anksčiau, vertės tipai paprastai saugomi rietuvėje.

Dažnai klaidinga nuomonė, kad vertės tipai visada saugomi rietuvėje. Geriau sakyčiau, kad vertybių tipai gali kai kintamasis yra laikinas kintamasis arba yra vietinis kintamasis, o JIT kompiliatorius nusprendžia neregistruoti vertės. Iš esmės faktinė vertės tipo vieta priklauso nuo JIT kompiliatoriaus įdiegimo. Atkreipkite dėmesį, kad vertės tipas gali būti saugomas rietuvės rėmelyje, procesoriaus registre ar net kaupo atmintyje, jei vertės tipas yra objekto viduje, t. Y. Jei tai yra nuorodos tipo dalis. Priešingai, nuorodų tipai saugomi GC kaupe. Nuoroda saugoma rietuvėje, o objektas priskiriamas kaupui.

Reikšmės tipo egzemplioriai ar nuorodos yra saugomi rietuvėje, registre ar kaupe, atsižvelgiant į tai, ar egzemplioriaus, ar nuorodos gyvenimo laikas yra trumpalaikis, ar ilgai. Vertės tipas gali būti rietuvėje, jei jie yra vietiniai kintamieji, ir valdomame kaupe, jei jie yra klasės laukai, t. Y. Jie priklauso nuorodos tipui arba yra jo dalis.

Perdavimas pagal vertę ir perdavimas pagal nuorodą

Šis kodų sąrašas parodo, kaip galite perduoti kintamąjį metodui pagal vertę.

 statinis niekinis prieaugis (int i)

        {

i = i + 1;

        }

statinis negaliojantis Pagrindinis ()

        {

int x = 1;

Padidėjimas (x);

Console.WriteLine ("x reikšmė yra:" + x);

Pultas.Skaitykite ();

        }

Atminkite, kad vertės tipą kaip nuorodą į metodą galite perduoti naudodami ref raktinį žodį. Tai iliustruoja šis kodų sąrašas.

statinis niekinis prieaugis (nuoroda int i)

        {

i = i + 1;

        }

statinis negaliojantis Pagrindinis ()

        {

int x = 1;

Prieaugis (ref x);

Console.WriteLine ("x reikšmė yra:" + x);

Pultas.Skaitykite ();

        }

Kai bus įvykdytas aukščiau pateiktas kodas, konsolėje bus rodomas pranešimas „x reikšmė yra: 2“.

Boksas ir išpakavimas

Vertės tipo pavertimas nuorodos tipu yra žinomas kaip boksas. „Unboxing“ yra atvirkščiai - jis apibrėžiamas kaip nuorodos tipo konversijos į vertės tipą procesas. Šis kodo fragmentas iliustruoja boksavimą ir išpakavimą C #.

int i = 100;

Objektas obj = i; // Boksas

i = (int) obj; // Išpakuoti