Programiranje

Kako uporabljati upravljane kazalce v jeziku C #

Kazalec je spremenljivka, ki kaže na naslov druge spremenljivke. Z drugimi besedami, kazalec vsebuje pomnilniški naslov druge spremenljivke ali pomnilniško mesto. Do nedavnega je bil edini način za delo s kazalci v C # z uporabo nevarne kode. Lahko bi izkoristili nevarno ključna beseda za definiranje nevarnega konteksta in nato ustvarjanje neupravljanih kazalcev ali priklic izvornih funkcij z uporabo neupravljanih kazalcev.

Tu je treba opozoriti, da nevarna koda pomeni kodo, ki se izvaja zunaj konteksta CLR. To je neupravljana koda. Ker pa privzeto izklopite varnost, ki jo zagotavlja CLR, je priporočljivo, da uporabljate nevarno kodo le, če veste, kako deluje upravljanje s pomnilnikom v .Net.

Sklic na objekt v C # je varni kazalec, ki kaže na začetek predmeta. V CLR obstaja še ena vrsta kazalca, znana kot upravljani kazalec. Ta članek preučuje, kaj so upravljani kazalci, zakaj so uporabni in kako lahko z njimi delamo v jeziku C #.

Razloženi upravljani kazalci v jeziku C #

Upravljani kazalec se od tipo varnega kazalca razlikuje po tem, da lahko kaže na druge lokacije predmeta, torej ne le na začetek predmeta. Tako kot sklic na objekt lahko tudi upravljani kazalec kaže na predmete, shranjene v upravljani kopici. Razlika je v tem, da medtem ko referenca predmeta kaže na začetek predmeta, lahko upravljani kazalec kaže na parametre metode, polja, elemente matrike ali kateri koli drug del predmeta.

V bistvu lahko upravljani kazalec kaže na naslednje:

  • lokalna spremenljivka
  • element matrike
  • parameter metode
  • polje sestavljenega tipa

Upravljani kazalci ne podpirajo aritmetike kazalcev neposredno. Vrednosti naslovov, na katere kažejo, ne morete »dodati« ali »odšteti«. Vrednosti upravljanega kazalca ne morete označiti. Očitno zaradi teh omejitev upravljani kazalci niso izrecno izpostavljeni v jeziku C #. Vendar pa so upravljani kazalci že dolgo implicitni v C # kot referenčni parametri. Ko posredujete parameter metodi s sklicem, uporabljate upravljani kazalec v ozadju.

10 pravil za uporabo upravljanih kazalcev v jeziku C #

Upoštevajte naslednje točke na upravljanih kazalcih.

  1. Upravljani kazalci ne smejo biti nični.
  2. Upravljani kazalec ni mogoče usmeriti na drug upravljani kazalec.
  3. Upravljanih kazalcev ne more biti na kupu.
  4. Upravljanega kazalca ne morete zamenjati s sklicem na objekt.
  5. Upravljanih kazalcev ne morete shraniti v statične spremenljivke ali kot elemente polja ali polja.
  6. Upravljanih kazalcev ne morete uporabiti kot vrsto elementa polja.
  7. Upravljani kazalec lahko kaže na sklic na objekt ali vrsto vrednosti.
  8. Če posredujete parameter metode kot referenco, je argument dejansko upravljani kazalec.
  9. Upravljani kazalci se imenujejo tudi tipi byref.
  10. Upravljani kazalec lahko kaže na lokalno spremenljivko metode ali parameter metode.

Prenesite argument s sklicem v C #

V redu, konceptov imamo dovolj. Napišimo zdaj nekaj kode, da bomo razumeli upravljane kazalce. Za predstavljanje upravljanega kazalca lahko uporabite parametre ref, ref local ali ref return. Raziskujmo vsako od teh eno za drugo.

Razmislite o naslednji strukturi, ki vsebuje samo enega člana, celoštevilčno spremenljivko.

javna struktura MyStruct

{

javni int MyField;

}

Naslednja metoda posodablja vrednost podatkovnega člana MyField primerka MyStruct.

zasebna statična void posodobitev (ref MyStruct podatki)

{

data.MyField = 5;

}

Naslednji delček kode ponazarja, kako lahko argument posredujete s sklicevanjem namesto z vrednostjo.

public int Main ()

{

MyStruct obj = nov MyStruct ();

obj.MyField = 1;

Posodobitev (ref. Obj);

Console.WriteLine (obj.MyField);

Console.Read ();

}

Namesto razredov lahko izkoristite strukture, da se izognete dodeljevanju kopice in splošnim kopiranjem podatkov. To je dober trik za optimizacijo, ki ga lahko uporabimo za strukture, ki imajo malo podatkovnih članov.

Ko zaženete zgornji program, se v oknu konzole prikaže »5«.

Uporabite ref lokal za shranjevanje upravljanega kazalca v C #

Za shranjevanje upravljanega kazalca lahko uporabite tudi ref local. Naslednji delček kode prikazuje, kako je to mogoče doseči. Upoštevajte uporabo ključne besede ref na obeh straneh naloge.

javna statična praznina UpdateDataUsingRefLocal (podatki MyStruct)

  {

ref int refLocal = ref data.MyField;

refLocal = 10;

  }

Vrne ref lahko izkoristite za vrnitev spremenljivke iz metode, ki predstavlja upravljani kazalec. Upoštevajte, da to ne more biti lokalna spremenljivka, torej ne morete vrniti lokalne spremenljivke, ki predstavlja upravljani kazalec. Poskus vrnitve lokalne spremenljivke bo povzročil napako pri prevajanju.

Naslednji delček kode prikazuje, kako je mogoče uporabiti povratne podatke ref.

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

{

vrnite oznake ref [subjectIndex];

}

Medtem ko referenca na objekt kaže na začetek predmeta, lahko upravljani kazalec kaže znotraj predmeta, na polje tipa ali na element polja. Zanimivo je vedeti, kako upravljani kazalci delujejo v zakulisju. O tem, kako upravljani kazalci delujejo, bom podrobneje razpravljal v prihodnjem prispevku tukaj.

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