Csharp/Betinget utførelse

(Omdirigert fra «Csharp/Kapittel9»)

Betinget utførelse

rediger

Ofte vil man utføre instruksjoner basert på et utsagn, det finnes genrelt to måter å gjøre det på

if sjekker om et uttrykk blir true eller false, og utfører instruksjoner deretter Man kan legge til else if, for å utføre ytterligere instruksjoner basert på flere utsagn, og else blir utført dersom alle blir false. Vær oppmerksom på at det er stor forskjell mellom sammenligning (==), og tilegnelse (=). I en if setning, brukes som regel kun sammenligning

if([verdi])
{
}
else if([verdi])
{
}
else
{
}

Man trenger ikke skrive else, eller else if hvis man ikke har bruk for det i funksjonen.

Et eksempel på if, er at man kun vil fortsette hvis brukeren sitt brukernavn er riktig.

if(Environment.Username == "John Doe")
 MainAppLoop();
else
{
  MessageBox.Show("Unknown username!");
  return 0;
}

If som en funksjon

rediger

I de fleste språk, har man en funksjon, som kan utføre if innenfor en linje, og gi tilbake et resultat basert på verdien i et uttrykk, i C# skrives denne med et spørsmålstegn (?) og else skrives som et kolon (:) Et eksempel kan være at man vil tilegne en verdi til en Brush, basert på man vil ha svart eller hvit

public static System.Drawing.Brush GetBrush(bool black)
{
  return (black ? System.Drawing.Brushes.Black : System.Drawing.Brushes.White);
}

Denne funksjonen, med det fiffige navnet ?? vil gi tilbake en verdi basert på om den første verdien er null eller ikke. Sett at man definerer en Brush et sted, men vil at hvis den er null, skal bli svart, bruker man ??

public class Circle
{
  protected System.Drawing.Brush m_fill;
  public System.Drawing.Brush Fill { get { return m_fill; } set { m_fill = value; } }
  public void Draw(Graphics g)
  {
    g.FillEllipse(m_fill ?? System.Drawing.Brushes.Transparent, new System.Drawing.Rectangle(0, 0, 128, 128));
  }
}

Switch

rediger

switch utfører instruksjoner basert på verdien i et uttrykk, man kan dermed si at switch er en enkel form for if.

først begynner man med å skrive switch([uttrykk]) deretter har man en rekke "cases" som er basert på verdien, og eventuelt en default på slutten, som fungerer på samme måte som "else" i if Alle "cases" må avsluttes av break, goto, continue eller return.

DaysInWeek day = DaysInWeek.Tuesday;
switch(day)
{
  case DaysInWeek.Monday:
    Console.WriteLine("Det er mandag i dag.");
    break;
  case DaysInWeek.Tuesday:
    Console.WriteLine("Det er tirsdag i dag.");
    break;
  case DaysInWeek.Wednsday:
    Console.WriteLine("Det er onsdag i dag.");
    break;
  case DaysInWeek.Thursday:
    Console.WriteLine("Det er torsdag i dag.");
    break;
  case DaysInWeek.Friday:
    Console.WriteLine("Det er fredag i dag.");
    break;
  case DaysInWeek.Saturday:
    Console.WriteLine("Det er lørdag i dag.");
    break;
  case DaysInWeek.Sunday:
    Console.WriteLine("Det er søndag i dag.");
    break;
}

Dette kunne selvsagt blitt løst mye mer elegant, men den er kun skrevet som eksempel.

goto er en funksjon i C# som generelt sett er noe man skal styre unna, det trengs i noen svært få tilfeller, men kan også brukes i C# i switch for å gå til andre cases.

int d = 3;
switch(d)
{
case 0:
  MessageBox.Show("Hello World!");
  break;
default:
  goto case 0;
}

I dette eksempelet vil alle utfall føre til at den utfører instruksjonene i case 0.

For å bruke goto utenom cases, må man definere en label. En label er rett og slett et navn på en posisjon i koden, og brukes kun til goto. En label må inneholde et unikt navn, etterfulgt av et kolon, og kan kun stå i funksjoner.

loop:
MessageBox.Show("Hello World!");
goto loop;

Denne funksjonen vil skape en evig loop