Csharp/Pekere

(Omdirigert fra «Csharp/Kapittel19»)

Pekere

rediger

Pekere er noe som C og C++ programmerere er kjent med, de har stort sett samme funksjonen i C#, men vil kun kunne brukes i prosjekter kompilert med unsafe, og i funksjoner eller klasser definert som unsafe. Pekere defineres først med en primitiv datatype, f.eks. int, etterfulgt av en eller flere asterisk (*) og deretter navnet på variablen.

int* my_pointer;

deretter må vi tilegne det en verdi, dette kan vi hente fra en annen variabel, eller ved bruke av fixed funksjonen. I .NET har vi to typer objekter kan man si, flyttbare, og ikke flyttbare objekter. Grunnen til dette, er at mange objekter kan bli flyttet eller slettet mens programmet kjører (dette gjelder klasser og deres variabler) og vi må derfor sørge for at dette ikke skjer, defor bruker vi funksjonen fixed. Hvis vi vil ha pekeren til et array, bruker vi fixed f.eks.

int[] my_arr = new int[] { 32, 33, 34, 35, 36 };
fixed(int* ptr = my_arr)
{
  // Her kan man bruke pekeren til my_arr
}

for å hente pekeren til objekter som allerede er fixed (variabler stort sett) kan man bruke address-of operator (&)

int my_var = 20;
int* my_ptr = &my_var;

for å tilegne en verdi til området pekeren peker til, bruker man også asterisk, men i annen rekkefølge

int my_var = 20;
int* my_ptr = &my_var;
*my_ptr = 42; // dette vil gjøre at my_var blir satt til 42

Man kan også bruke strukturer, men for å endre verdiene i et felt da, må man bruke pil (->) framfor punktum (.)

public struct Vector
{
  float m_x;
  float m_y;
 
  public float X { get { return m_x; } set { m_x = value; } }
  public float Y { get { return m_y; } set { m_y = value; } }
}
public unsafe void PerformPointers()
{
  Vector[] arr = new Vector[] {new Vector(), new Vector(), new Vector()};
  fixed(Vector* ptr = arr)
  {
    for(int x = 0;x < 3;x++, ptr++)
    ptr->X = 32.0f; ptr->Y = 32.0f;
  }
}

Dette setter alle elementene i arr til (32, 32, 1)

Etter alt dette, kan man begynne å tenke hva dette kan brukes til, og svaret på det er ganske enkelt, svært lite. Men i enkelte tilfeller kan det være uunværlig, spesielt i kontakt med eldre funksjoner, enten fra biblioteker eller operativsystemet.

En ting som er hendig med pekere, er noe som kalles peker aritmetikk. pekere vil alltid øke med størrelsen på datatype ved addisjon, subtraksjon, divisjon og mulitplikasjon, dette gjør at det i enkelte tilfeller er veldig effektivt. Pekere kan brukes til å lage effekter på System.Drawing.Bitmap, som blur, ild eller lignende, men krever at programmereren er veldig fokusert, og tenker det godt igjennom. Dette gjøres ved å "låse" bitmapen ved bruk av Bitmap.Lock, denne funksjonen fratar GDI/GDI+ tilatelse til å bruke bitmapen helt til unlock blir kalt, og i mellom disse, kan pekere endre verdien på en særdeles effektiv måte.

Eksempel