Arbeiten mit .NET: C-Sharp/ Arbeitsablauf/ Kontrollstrukturen/ Sprungbefehle

Aus Wikibooks

Achtung, Baustelle! Dieses Buch wird zurzeit überarbeitet und in Arbeiten mit .NET eingegliedert.

Hinweise für Leser: Der Inhalt eines Kapitels passt unter Umständen nicht richtig zum Namen oder zur Gliederung. Gliederung und Inhaltsverzeichnis des Buches können vom Inhalt einzelner Kapitel abweichen. Verweise auf andere Kapitel können falsch sein.

Hinweis für Autoren: Bitte berücksichtigen Sie bereits jetzt die Konzeption der Buchreihe.

Manchmal ist es notwendig, den normalen Programmablauf unterbrechen und unmittelbar im Programmcode Sprünge durchführen zu können. Dabei helfen uns eine Reihe Sprungbefehle im C#.

Break[Bearbeiten]

Der break-Befehl unterbricht die Ausführung einer Schleife oder einer bedingten Verzweigung.

public void Methode()
{
  int i = 0;

  do
  {
    i++;
    if (i == 5) 
    {
      break;
    }

    Console.WriteLine( i );
  }
  while (i < 100);
}

Das Verwenden von break zum Abbrechen von Schleifen ist allerdings schlechter Programmierstil, da dadurch die Lesbarkeit des Codes leidet. Insbesondere entspricht in solchen Fällen die angegebene Schleifenbedingung nicht der wirklichen Schleifenbedingung. In dem obigen Beispiel lautet die Schleifenbedingung beispielsweise nicht (i < 100).

public void Methode()
{
  int i = 1;

  switch ( i )
  {
    case 1:
      Console.WriteLine( "Die Variable i hat zur Zeit den Wert: {0}", i );
      break;
    case 2:
      Console.WriteLine( "Die Variable i wurde verändert." );
      break;
  }  
}

Continue[Bearbeiten]

Das Schlüsselwort continue beginnt sofort den nächsten Schleifendurchlauf.

public void Methode()
{
  int i = 0;

  for (i = 1; i <= 10; i++)
  {
    if (i < 5)
    {
      continue;
    }

    Console.WriteLine( i );
  }
}
Wikipedia hat einen Artikel zum Thema:


Goto[Bearbeiten]

Der Sprungbefehl goto ist ein Relikt aus der Zeit des Spaghetti-Codes. Mit seiner Hilfe kann man – nahezu – beliebig im Programmcode herumspringen: Dieses Beispiel simuliert eine einfache Schleife, indem solange zur sogenannten Sprungmarke gesprungen wird, wie i kleiner als 5 ist.

public int Methode()
{
  int i = 0;

Top:           // Sprungmarke

  if (i < 5) 
  {
    i++;
   
    goto Top;  // Sprungbefehl
  }

  Console.WriteLine( i );
}


Letzten Endes ist dieser Sprungbefehl aber nur ein Zugeständnis an die Leute, die zwar mit C# programmieren wollen, aber den goto-Sprungbefehl aus anderen Programmiersprachen, beispielsweise C, gewohnt sind und glauben, nicht mehr ohne leben zu können. Wir, als echte objektorientierte Programmierer, sollten darauf völlig verzichten. Es gibt praktisch keine Situation, in der wir nicht ebenso gut – oder sogar viel besser – mit anderen Mitteln auskommen:

public int Methode()
{
  int i = 0;

  while (i < 10) 
  {
    i++;
  }

  Console.WriteLine( i );
}

Return[Bearbeiten]

Dieser Sprungbefehl wird uns allerdings sehr häufig begegnen. Mit Hilfe des Schlüsselworts return beenden wir die Ausführung einer Methode unmittelbar.

public void Methode()
{
  int i = 10;
 
  return;

  Console.WriteLine( i );  // Diese Zeile wird nie erreicht.
}

Je nachdem, ob die Methode einen Rückgabewert hat, kann auch return einen Wert (dann allerdings vom gleichen Datentyp) zurückgeben:

public int Methode()
{
  int i = 10;
 
  return i;
 
  Console.WriteLine( i );  // Diese Zeile wird nie erreicht.
}
public string Methode()
{
  string ergebnis = "Wir testen den Sprungbefehl return.";
 
  return ergebnis;

  Console.WriteLine( ergebnis );  // Diese Zeile wird nie erreicht.
}

Dieser Sprungbefehl wird uns insbesondere in den bedingten Verzweigungen wieder begegnen.

Throw[Bearbeiten]

Das Schlüsselwort throw löst eine Ausnahme aus und beendet, genauso wie return, unmittelbar die weitere Ausführung der Methode, um direkt zur nächsten Ausnahmebehandlung zu laufen. Gibt es keine Ausnahmebehandlung und gehört die mit throw ausgelöste Ausnahme zu den kritischen, wird gegebenenfalls auch das Programm mehr oder weniger brutal beendet.

public int Methode()
{
  int i = 10;
 
  if (i == 10) throw;

  Console.WriteLine( i );  // Diese Zeile wird nie erreicht.
}

Obwohl man throw ganz offensichtlich zum Springen benutzen kann, gehört es zum wirklich schlechten Stil, solche Konstrukte zu bauen. Und das nicht nur, weil wir damit die Performance unseres Programms wirklich negativ beeinflussen. Das Auslösen einer Ausnahme wird im Kapitel Ausnahmen und Fehler genauer behandelt.

Siehe auch[Bearbeiten]

Jump Statements (C# Reference) (Microsoft, englisch)