Programmering

Slik bruker du administrerte pekere i C #

En peker er en variabel som peker på adressen til en annen variabel. Med andre ord holder en peker minneadressen til en annen variabel eller en minneplassering. Inntil nylig var den eneste måten å jobbe med pekere i C # ved å bruke usikker kode. Du kan dra nytte av usikre nøkkelord for å definere en usikker kontekst og deretter opprette ikke-administrerte pekere eller påkalle innfødte funksjoner ved hjelp av ikke-administrerte pekere.

Det skal bemerkes her at usikker kode innebærer kode som utføres utenfor konteksten til CLR. Det er ukontrollert kode. Siden du slår av sikkerheten som tilbys av CLR som standard, anbefales det imidlertid at du bare bruker usikker kode hvis du er klar over hvordan minnestyring fungerer i .Net.

En objektreferanse i C # er en typesikker peker som peker på begynnelsen av et objekt. Det er en annen type peker i CLR, kjent som en administrert peker. Denne artikkelen undersøker hva administrert peker er, hvorfor de er nyttige, og hvordan vi kan jobbe med dem i C #.

Administrerte pekere i C # forklart

En administrert peker skiller seg fra en typesikker peker ved å kunne peke på andre steder av et objekt, dvs. ikke bare begynnelsen av objektet. Som en objektreferanse kan en administrert peker peke på objekter som er lagret i den administrerte dyngen. Forskjellen er at mens en objektreferanse peker på begynnelsen av objektet, kan en administrert peker peke på metodeparametere, felt, matriseelementer eller hvilken som helst annen del av objektet.

I hovedsak kan en administrert peker peke på følgende:

  • en lokal variabel
  • et element i en matrise
  • en metodeparameter
  • et felt av en sammensatt type

Administrerte pekere støtter ikke pekere-aritmetikk direkte. Du kan ikke "legge til" eller "trekke fra" verdiene til adressene de peker på. Du kan ikke legge inn en verdi for en administrert peker. Tilsynelatende er det på grunn av disse begrensningene at administrerte pekere ikke eksplisitt blir eksponert i C # -språket. Imidlertid har administrerte pekere vært implisitt i C # i lang tid som referanseparametere. Når du sender en parameter til en metode som referanse, bruker du en administrert peker bak kulissene.

10 regler for bruk av administrerte pekere i C #

Legg merke til følgende punkter på administrerte pekere.

  1. Administrerte pekere kan ikke være null.
  2. Det er ikke mulig for en administrert peker å peke på en annen administrert peker.
  3. Administrerte pekere kan ikke være på dyngen.
  4. Du kan ikke bytte en administrert peker med en objektreferanse.
  5. Du kan ikke lagre administrerte pekere i statiske variabler eller som elementer i en matrise eller felt.
  6. Du kan ikke bruke administrerte pekere som elementtype i en matrise.
  7. En administrert peker kan peke på en objektreferanse eller en verditype.
  8. Hvis du sender en metodeparameter som referanse, er argumentet faktisk en administrert peker.
  9. Administrerte pekere blir også referert til som byref-typer.
  10. En administrert peker kan peke på en lokal variabel i en metode eller en parameter i en metode.

Gi et argument med referanse i C #

Ok, vi har fått nok av konseptene. La oss nå skrive litt kode for å forstå administrerte pekere. Du kan bruke ref-parametere, ref lokalbefolkningen eller ref-retur for å representere en administrert peker. La oss utforske hver av disse en etter en.

Tenk på følgende struktur som bare inneholder ett medlem, en heltallvariabel.

offentlig struktur MyStruct

{

offentlig int MyField;

}

Følgende metode oppdaterer verdien av MyField-datamedlemet til en forekomst av MyStruct.

privat statisk ugyldig oppdatering (ref MyStruct data)

{

data.MyField = 5;

}

Følgende kodebit illustrerer hvordan du kan sende et argument med referanse i stedet for verdi.

offentlig int Main ()

{

MyStruct obj = ny MyStruct ();

obj.MyField = 1;

Oppdatering (ref obj);

Console.WriteLine (obj.MyField);

Console.Read ();

}

Du kan dra nytte av strukturer i stedet for klasser for å unngå haugetildeling og overhead av kopiering av data. Dette er et godt optimaliseringstriks som kan brukes til strukturer som har få datamedlemmer.

Når du kjører programmet ovenfor, vises "5" i konsollvinduet.

Bruk en ref-lokal til å lagre en administrert peker i C #

Du kan også bruke en ref-lokal til å lagre en administrert peker. Følgende kodebit illustrerer hvordan dette kan oppnås. Legg merke til bruken av ref-nøkkelordet på begge sider av oppgaven.

offentlig statisk ugyldig UpdateDataUsingRefLocal (MyStruct data)

  {

ref int refLocal = ref data.MyField;

refLocal = 10;

  }

Du kan dra nytte av ref-retur for å returnere en variabel fra en metode som representerer en administrert peker. Merk at dette ikke kan være en lokal variabel, dvs. at du ikke kan returnere en lokal variabel som representerer en administrert peker. Et forsøk på å returnere en lokal variabel vil resultere i en kompileringsfeil.

Følgende kodebit illustrerer hvordan ref returnerer kan brukes.

offentlig statisk ref int GetMarksByRef (int [] merker, int subjectIndex)

{

returnere ref merker [subjectIndex];

}

Mens en objektreferanse peker på begynnelsen av et objekt, kan en administrert peker peke inne i et objekt, til et felt av en type eller til et element i en matrise. Det er interessant å vite hvordan administrerte pekere fungerer bak kulissene. Jeg vil diskutere hvordan administrerte pekere fungerer mer detaljert i et fremtidig innlegg her.