Kako koristiti upravljane pokazivače u C #

Pokazivač je varijabla koja upućuje na adresu druge varijable. Drugim riječima, pokazivač sadrži memorijsku adresu druge varijable ili memorijskog mjesta. Do nedavno, jedini način rada s pokazivačima u C # bio je korištenje nesigurnog koda. Možete iskoristiti unsafe ključnu riječ za definiranje nesigurnog konteksta, a zatim stvoriti neupravljane pokazivače ili pozvati nativne funkcije pomoću neupravljanih pokazivača.

Ovdje treba napomenuti da nesigurni kôd podrazumijeva kôd koji se izvršava izvan konteksta CLR-a. To je neupravljani kod. Međutim, budući da prema zadanim postavkama isključujete sigurnost koju pruža CLR, preporučljivo je koristiti nesigurni kôd samo ako znate kako upravljanje memorijom funkcionira u .Netu.

Referenca na objekt u C # pokazivač je sigurnog tipa koji pokazuje na početak objekta. U CLR-u postoji još jedna vrsta pokazivača poznata kao upravljani pokazivač. Ovaj članak ispituje što su upravljani pokazivači, zašto su korisni i kako s njima možemo raditi u C #.

Objašnjeni upravljani pokazivači u C #

Upravljani pokazivač razlikuje se od pokazivača sigurnog za tip po mogućnosti usmjeravanja na druga mjesta objekta, tj. Ne samo na početak objekta. Poput reference na objekt, upravljani pokazivač može ukazivati ​​na objekte pohranjene u upravljanoj hrpi. Razlika je u tome što, iako referenca na objekt pokazuje na početak objekta, upravljani pokazivač može usmjeravati na parametre metode, polja, elemente niza ili bilo koji drugi dio objekta.

U osnovi, upravljani pokazivač može ukazivati ​​na sljedeće:

  • lokalna varijabla
  • element niza
  • parametar metode
  • polje složenog tipa

Upravljani pokazivači ne podržavaju izravno aritmetiku pokazivača. Ne možete "zbrajati" ili "oduzimati" vrijednosti adresa na koje upućuju. Ne možete unijeti vrijednost upravljanog pokazivača. Izgleda da se zbog ovih ograničenja upravljani pokazivači nisu eksplicitno izloženi u jeziku C #. Međutim, upravljani pokazivači već su dugo implicitni u C # kao referentni parametri. Kada prosljeđujete parametar metodi referencom, koristite upravljani pokazivač iza kulisa.

10 pravila za upotrebu upravljanih pokazivača u C #

Imajte na umu sljedeće točke na upravljanim pokazivačima.

  1. Upravljani pokazivači ne mogu biti nula.
  2. Nije moguće da upravljani pokazivač pokazuje na drugi upravljani pokazivač.
  3. Upravljani pokazivači ne mogu biti na hrpi.
  4. Upravljani pokazivač ne možete zamijeniti referencom objekta.
  5. Upravljane pokazivače ne možete pohraniti u statičke varijable ili kao elemente niza ili polja.
  6. Kao tip elementa niza ne možete koristiti upravljane pokazivače.
  7. Upravljani pokazivač može ukazivati ​​na referencu na objekt ili na vrstu vrijednosti.
  8. Ako parametar metode proslijedite kao referencu, argument je zapravo upravljani pokazivač.
  9. Upravljani pokazivači nazivaju se i byref vrstama.
  10. Upravljani pokazivač može ukazivati ​​na lokalnu varijablu metode ili parametar metode.

Proslijedite argument referencom u C #

U redu, dosta nam je koncepata. Napišimo sada neki kôd da bismo razumjeli upravljane pokazivače. Možete koristiti ref parametre, ref local ili ref return da predstavljaju upravljani pokazivač. Istražimo svaku od njih jednu po jednu.

Razmotrite sljedeću strukturu koja sadrži samo jednog člana, cjelobrojnu varijablu.

javna struktura MyStruct

{

   javni int MyField;

}

Sljedeća metoda ažurira vrijednost člana podataka MyField instance instance MyStruct.

privatno statičko prazno ažuriranje (ref. MyStruct podaci)

{

   data.MyField = 5;

}

Sljedeći isječak koda ilustrira kako argument možete proslijediti referencom umjesto vrijednošću.

javni int Main ()

{

  MyStruct obj = novi MyStruct ();

  obj.MyField = 1;

  Ažuriranje (ref obj);

  Console.WriteLine (obj.MyField);

  Console.Read ();

}

Možete iskoristiti strukture umjesto klasa kako biste izbjegli raspodjelu hrpe i općenito kopiranje podataka. Ovo je dobar trik za optimizaciju koji se može koristiti za strukture koje imaju malo članova podataka.

Kada izvršite gornji program, na prozoru konzole prikazuje se "5".

Upotrijebite ref local za pohranu upravljanog pokazivača u C #

Također možete koristiti ref local za pohranu upravljanog pokazivača. Sljedeći isječak koda ilustrira kako se to može postići. Primijetite upotrebu ključne riječi ref na obje strane zadatka.

javna statička praznina UpdateDataUsingRefLocal (MyStruct podaci)

  {

     ref int refLocal = ref podaci.MyField;

     refLocal = 10;

  }

Možete iskoristiti povrat ref da biste vratili varijablu iz metode koja predstavlja upravljani pokazivač. Imajte na umu da ovo ne može biti lokalna varijabla, tj. Ne možete vratiti lokalnu varijablu koja predstavlja upravljani pokazivač. Pokušaj vraćanja lokalne varijable rezultirat će pogreškom kompilacije.

Sljedeći isječak koda ilustrira kako se ref povrat može koristiti.

javni statički ref int GetMarksByRef (oznake int [], int subjectIndex)

{

  vratiti ref oznake [subjectIndex];

}

Dok referenca na objekt upućuje na početak objekta, upravljani pokazivač može usmjeravati unutar objekta, na polje tipa ili na element niza. Zanimljivo je znati kako upravljani pokazivači rade iza kulisa. O tome kako upravljani pokazivači rade detaljnije ću raspraviti u sljedećem postu ovdje.