Ohjelmointi

Hallittujen osoittimien käyttäminen C #: ssä

Osoitin on muuttuja, joka osoittaa toisen muuttujan osoitteeseen. Toisin sanoen osoitin pitää sisällään toisen muuttujan tai muistipaikan muistiosoitteen. Viime aikoihin asti ainoa tapa työskennellä osoittimien kanssa C #: ssä oli käyttää vaarallista koodia. Voit hyödyntää vaarallinen avainsana määritelläksesi vaarallisen kontekstin ja luomalla sitten hallitsemattomia osoittimia tai kutsumalla natiivitoimintoja käyttämällä hallitsemattomia osoittimia.

Tässä on huomattava, että vaarallinen koodi tarkoittaa koodia, joka suoritetaan CLR-kontekstin ulkopuolella. Se on hallitsematon koodi. Koska kuitenkin otat oletusarvoisesti pois käytöstä CLR: n tarjoaman turvallisuuden, on suositeltavaa käyttää vaarallista koodia vain, jos tiedät kuinka muistinhallinta toimii .Netissä.

Kohdeviite C #: ssä on tyyppikohtainen osoitin, joka osoittaa objektin alkuun. CLR: ssä on toisen tyyppinen osoitin, joka tunnetaan nimellä hallittu osoitin. Tässä artikkelissa tarkastellaan mitä hallittu osoitin on, miksi ne ovat hyödyllisiä ja miten voimme työskennellä heidän kanssaan C #: ssä.

C #: n hallinnoidut osoittimet on selitetty

Hallittu osoitin eroaa tyyppikohtaisesta osoittimesta siinä, että se pystyy osoittamaan kohteen muihin paikkoihin, ts. Ei vain kohteen alkuun. Kuten objektiviite, hallittu osoitin voi osoittaa hallittuun kasaan tallennettuihin kohteisiin. Ero on siinä, että vaikka objekti viittaa objektin alkuun, hallittu osoitin voi osoittaa menetelmän parametreihin, kenttiin, taulukkoelementteihin tai mihin tahansa muuhun objektin osaan.

Pohjimmiltaan hallittu osoitin voi osoittaa seuraavaa:

  • paikallinen muuttuja
  • matriisin elementti
  • method-parametri
  • yhdistetyyppinen kenttä

Hallinnoidut osoittimet eivät tue suoraan osoittimen aritmeettisuutta. Et voi "lisätä" tai "vähentää" niiden osoitteiden arvoja, joihin he osoittavat. Et voi laatia hallitun osoittimen arvoa. Ilmeisesti juuri näiden rajoitusten takia hallittuja osoittimia ei nimenomaisesti paljasteta C # -kielellä. Hallinnoidut osoittimet ovat kuitenkin olleet implisiittisiä C #: ssä jo pitkään vertailuparametreina. Kun välität parametrin menetelmälle viitteenä, käytät hallittua osoitinta kulissien takana.

10 sääntöä hallittujen osoittimien käyttämiseen C #: ssä

Huomaa seuraavat kohdat hallinnoiduista osoittimista.

  1. Hallinnoidut osoittimet eivät voi olla nollia.
  2. Hallittu osoitin ei voi osoittaa toiseen hallittuun osoittimeen.
  3. Hallinnoidut osoittimet eivät voi olla kasalla.
  4. Hallittua osoitinta ei voi vaihtaa objektiviitteeseen.
  5. Hallittuja osoittimia ei voi tallentaa staattisiin muuttujiin tai taulukon tai kentän elementteinä.
  6. Et voi käyttää hallittuja osoittimia matriisin elementtityyppinä.
  7. Hallittu osoitin voi osoittaa objektiviittaukseen tai arvotyyppiin.
  8. Jos välität menetelmäparametrin viitteenä, argumentti on itse asiassa hallittu osoitin.
  9. Hallittuja osoittimia kutsutaan myös byref-tyypeiksi.
  10. Hallittu osoitin voi osoittaa menetelmän paikalliseen muuttujaan tai menetelmän parametriin.

Välitä argumentti viitteellä numeroon C #

Okei, meillä on tarpeeksi käsitteitä. Kirjoita nyt koodi ymmärtämään hallittuja viitteitä. Voit käyttää ref-parametreja, ref-paikallisia tai ref-palautuksia edustamaan hallittua osoitinta. Tutkitaan näitä kaikkia yksi kerrallaan.

Harkitse seuraavaa rakennetta, joka sisältää vain yhden jäsenen, kokonaislukumuuttujan.

public struct MyStruct

{

julkinen MyField;

}

Seuraava menetelmä päivittää MyStruct-ilmentymän MyField-tietojäsenen arvon.

yksityinen staattinen void -päivitys (tarkista MyStruct-tiedot)

{

data.Kenttä = 5;

}

Seuraava koodinpätkä kuvaa, kuinka voit välittää argumentin viitteenä arvon sijaan.

public int Main ()

{

MyStruct obj = uusi MyStruct ();

obj.MyField = 1;

Päivitys (ref obj);

Console.WriteLine (obj.MyField);

Konsoli.Lue ();

}

Voit hyödyntää luokkien sijasta tehtäviä rakenteita, jotta vältät kasan allokoinnin ja tietojen kopioinnin yleiskustannukset. Tämä on hyvä optimointitrikki, jota voidaan käyttää rakenteissa, joissa on vähän datajäseniä.

Kun suoritat yllä olevan ohjelman, “5” näkyy konsoli-ikkunassa.

Käytä ref-paikallista tallentaaksesi hallinnoidun osoittimen C #

Voit myös käyttää ref-paikallista hallitun osoittimen tallentamiseen. Seuraava koodinpätkä kuvaa, miten tämä voidaan saavuttaa. Huomaa ref-avainsanan käyttö tehtävän molemmilla puolilla.

public static void UpdateDataUsingRefLocal (MyStruct-tiedot)

  {

ref int refLocal = viite data.MyField;

refLocal = 10;

  }

Voit palautusmuuttujan avulla palauttaa muuttujan menetelmästä, joka edustaa hallittua osoitinta. Huomaa, että tämä ei voi olla paikallinen muuttuja, ts. Et voi palauttaa paikallista muuttujaa, joka edustaa hallittua osoitinta. Paikallisen muuttujan palautusyritys johtaa kokoamisvirheeseen.

Seuraava koodinpätkä kuvaa, kuinka ref-palautuksia voidaan käyttää.

julkinen staattinen viite int GetMarksByRef (int [] merkit, int subjectIndex)

{

palautusviitemerkit [subjectIndex];

}

Kun objekti viittaa objektin alkuun, hallittu osoitin voi osoittaa objektin sisällä, tyypin kenttään tai taulukon elementtiin. On mielenkiintoista tietää, miten hallitut osoittimet toimivat kulissien takana. Keskustelen siitä, miten hallitut osoittimet toimivat tarkemmin seuraavassa postissa täällä.

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