Programmering

Sådan bruges administrerede markører i C #

En markør er en variabel, der peger på adressen til en anden variabel. Med andre ord holder en markør hukommelsesadressen på en anden variabel eller en hukommelsesplacering. Indtil for nylig var den eneste måde at arbejde med markører i C # ved at bruge usikker kode. Du kan drage fordel af usikre nøgleord for at definere en usikker kontekst og derefter oprette ikke-administrerede markører eller påberåbe sig oprindelige funktioner ved hjælp af ikke-administrerede markører.

Det skal her bemærkes, at usikker kode indebærer kode, der udføres uden for CLR-sammenhængen. Det er ikke-administreret kode. Da du som standard deaktiverer sikkerheden fra CLR, anbefales det imidlertid, at du kun bruger usikker kode, hvis du er opmærksom på, hvordan hukommelsesadministration fungerer i .Net.

En objektreference i C # er en typesikker markør, der peger på begyndelsen af ​​et objekt. Der er en anden type markør i CLR kendt som en styret markør. Denne artikel undersøger, hvad managed pointer er, hvorfor de er nyttige, og hvordan vi kan arbejde med dem i C #.

Administrerede henvisninger i C # forklaret

En styret markør adskiller sig fra en typesikker markør ved at være i stand til at pege på andre placeringer af et objekt, dvs. ikke kun begyndelsen på objektet. Som en objektreference kan en styret markør pege på objekter, der er gemt i den administrerede bunke. Forskellen er, at mens en objektreference peger på begyndelsen af ​​objektet, kan en styret markør pege på metodeparametre, felter, arrayelementer eller enhver anden del af objektet.

I det væsentlige kan en styret markør pege på følgende:

  • en lokal variabel
  • et element i en matrix
  • en metodeparameter
  • et felt af en sammensat type

Administrerede markører understøtter ikke direkte markørregning. Du kan ikke "tilføje" eller "trække" værdierne af de adresser, de peger på. Du kan ikke markere en værdi for en administreret markør. Tilsyneladende er det på grund af disse begrænsninger, at administrerede pegepinde ikke eksplicit vises i C # -sprog. Dog har administrerede markører været implicitte i C # i lang tid som referenceparametre. Når du sender en parameter til en metode som reference, bruger du en styret markør bag kulisserne.

10 regler til brug af administrerede markører i C #

Bemærk følgende punkter på administrerede markører.

  1. Administrerede markører kan ikke være nul.
  2. Det er ikke muligt for en styret markør at pege på en anden styret markør.
  3. Administrerede markører kan ikke være på bunken.
  4. Du kan ikke udveksle en administreret markør med en objektreference.
  5. Du kan ikke gemme administrerede markører i statiske variabler eller som elementer i et array eller felt.
  6. Du kan ikke bruge administrerede markører som elementtypen i en matrix.
  7. En styret markør kan pege på en objektreference eller en værditype.
  8. Hvis du sender en metodeparameter som reference, er argumentet faktisk en styret markør.
  9. Administrerede markører kaldes også byref-typer.
  10. En styret markør kan pege på en lokal variabel i en metode eller en parameter i en metode.

Send et argument med reference i C #

Okay, vi har fået nok af begreberne. Lad os nu skrive nogle kode for at forstå styrede pegepinde. Du kan bruge ref-parametre, ref lokale eller ref returnerer til at repræsentere en styret markør. Lad os udforske hver af disse en efter en.

Overvej følgende struktur, der kun indeholder et medlem, en heltalsvariabel.

offentlig struktur MyStruct

{

offentlig int MyField;

}

Den følgende metode opdaterer værdien af ​​MyField-dataledem i en forekomst af MyStruct.

privat statisk ugyldig opdatering (ref MyStruct data)

{

data.MyField = 5;

}

Følgende kodestykke illustrerer, hvordan du kan videregive et argument med reference i stedet for værdi.

offentlig int Main ()

{

MyStruct obj = ny MyStruct ();

obj.MyField = 1;

Opdatering (ref obj)

Console.WriteLine (obj.MyField);

Console.Read ();

}

Du kan drage fordel af strukturer i stedet for klasser for at undgå bunktildeling og omkostningerne ved kopiering af data. Dette er et godt optimeringstrick, der kan bruges til strukturer, der har få datamedlemmer.

Når du udfører ovenstående program, vises “5” i konsolvinduet.

Brug en ref-lokal til at gemme en administreret markør i C #

Du kan også bruge en ref-lokal til at gemme en administreret markør. Følgende kodestykke illustrerer, hvordan dette kan opnås. Bemærk brugen af ​​ref-nøgleordet på begge sider af opgaven.

offentlig statisk ugyldig UpdateDataUsingRefLocal (MyStruct data)

  {

ref int refLocal = ref data.MyField;

refLocal = 10;

  }

Du kan drage fordel af ref returnerer for at returnere en variabel fra en metode, der repræsenterer en administreret markør. Bemærk, at dette ikke kan være en lokal variabel, dvs. du kan ikke returnere en lokal variabel, der repræsenterer en administreret markør. Et forsøg på at returnere en lokal variabel vil resultere i en kompileringsfejl.

Følgende kodestykke illustrerer, hvordan ref-returneringer kan bruges.

offentlig statisk ref int GetMarksByRef (int [] mærker, int subjectIndex)

{

returnere ref-mærker [subjectIndex];

}

Mens en objektreference peger på begyndelsen af ​​et objekt, kan en styret markør pege inde i et objekt, til et felt af en type eller til et element i en matrix. Det er interessant at vide, hvordan styrede henvisninger fungerer bag kulisserne. Jeg vil diskutere, hvordan styrede pegepinde fungerer mere detaljeret i et fremtidigt indlæg her.