Programmēšana

Dziļa niršana: vērtības un atsauces veidi .Net

Microsoft .Net veidi var būt vai nu vērtības tips, vai atsauces tips. Lai gan vērtību veidi parasti tiek glabāti kaudzē, atsauces veidi tiek glabāti pārvaldītajā kaudzē.

Vērtības tips izriet no System.ValueType un satur datus atmiņā. Citiem vārdiem sakot, mainīgajiem vai objektiem vai vērtību tipiem ir sava datu kopija.

Tikmēr atsauces tips paplašina sistēmu. Objekts un norāda uz vietu atmiņā, kurā ir faktiskie dati. Jūs varat iedomāties atsauces tipu, kas ir līdzīgs rādītājam, kurš netieši tiek noraidīts, kad tiem piekļūstat. Iebūvētie atsauces tipi, kurus atbalsta C #, ietver: objektu, virkni un dinamisko. Visi pamatdatu tipi, Būla skaitlis, Datums, struktūras un uzskaitījumi ir vērtību tipu piemēri. Atsauces tipu piemēri: virknes, masīvi, klašu objekti utt. Lai izveidotu atsauces tipus C #, varat izmantot šo atslēgvārdu priekšrocības: klase, saskarne un deleģēt.

Ņemiet vērā, ka atšķirībā no atsauces veida jūs nevarat atvasināt no vērtības veida, kā arī nevar piešķirt nulles vērtību tieši vērtības tipam. Vērtības tipam nulles vērtību var piešķirt tikai, izmantojot priekšrocības, ko sniedz nederīgi tipi - funkcija, kas pievienota jaunākajām .Net Framework versijām. Kad vērtības tips tiek kopēts uz citu, vērtība tiek kopēta. Tādējādi jūs varat manipulēt ar tajās esošajām vērtībām neatkarīgi no otra - izmaiņas vienā neietekmē otru. Gluži pretēji, kopējot atsauces tipu citā, atsauce tiek kopēta. Ja maināt vienu no tiem, tiek ietekmēts arī otrs. Piemēram, ja viena no atsaucēm ir iestatīta uz nulli, otra arī kļūst nulles.

Uzglabāšanas vietas

CLR objektus uzglabā trīs veidu glabāšanas vietās - reģistros, kaudzē vai pārvaldītajā kaudzē. Kamēr īslaicīgie objekti tiek glabāti reģistros vai kaudzē, tik ilgi saglabātie objekti tiek glabāti kaudzē. Kā jau minēju iepriekš, vērtību veidi parasti tiek glabāti kaudzē.

Parasti ir nepareizs uzskats, ka vērtību tipi vienmēr tiek glabāti kaudzē. Es drīzāk teiktu, ka vērtību veidi var Ja mainīgais ir pagaidu mainīgais vai ir lokāls mainīgais, un JIT kompilators nolemj vērtību nereģistrēt. Būtībā vērtības veida faktiskā atrašanās vieta ir atkarīga no JIT kompilatora ieviešanas. Ņemiet vērā, ka vērtības tipu var saglabāt kaudzes rāmī, CPU reģistrā vai pat kaudzes atmiņā, ja vērtības tips ir objekta iekšienē, t.i., ja tas ir atsauces tipa sastāvdaļa. Gluži pretēji, atsauces veidi tiek glabāti GC kaudzē. Atsauce tiek saglabāta kaudzē, kamēr objekts tiek piešķirts kaudzē.

Vērtības veida gadījumi vai atsauces tiek glabātas kaudzē, reģistrā vai kaudzē atkarībā no tā, vai instances vai atsauces kalpošanas laiks ir īss vai ilgs. Vērtības tips var atrasties kaudzē, ja tie ir lokāli mainīgie, un pārvaldītajā kaudzē, ja tie ir klases lauki, t.i., tie pieder atsauces tipam vai ir tā daļa.

Pāreja pēc vērtības un iet ar atsauci

Šis kodu saraksts parāda, kā mainīgo var nodot metodei pēc vērtības.

 static void Pieaugums (int i)

        {

i = i + 1;

        }

static void Main ()

        {

int x = 1;

Pieaugums (x);

Console.WriteLine ("x vērtība ir:" + x);

Konsole. Lasīt ();

        }

Ņemiet vērā, ka vērtības veidu kā atsauci uz metodi varat nodot, izmantojot ref atslēgvārdu. To ilustrē šāds kodu saraksts.

static void pieaugums (ref int i)

        {

i = i + 1;

        }

static void Main ()

        {

int x = 1;

Pieaugums (ref x);

Console.WriteLine ("x vērtība ir:" + x);

Konsole. Lasīt ();

        }

Kad iepriekšējais kods ir izpildīts, konsolē tiks parādīts ziņojums "x vērtība ir: 2".

Bokss un bokss

Vērtības veida pārveidošana par atsauces tipu ir pazīstama kā bokss. Unboxing ir tieši pretējs - tas tiek definēts kā atsauces veida pārveidošanas process par vērtību tipu. Šis koda fragments ilustrē boksa un unboxing darbību C #.

int i = 100;

Objekts obj = i; // Bokss

i = (int) obj; // Boksa noņemšana

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