Generell sollte man goto schon vermeiden, denn meistens lassen sich solche Konstrukte anders besser lösen. Ich habe letztens allerdings zum ersten mal seit Jahren mal wieder ein goto verwendet (ich bin nicht mal sicher, ob ich es unter Delphi überhaupt schon jemals benutzt habe - es sei denn man zählt exit und break dazu, die beiden Varianten nutze ich recht häufig):
Delphi-Quellcode:
label
loopend;
begin
Result := nil;
for i := 0 to FWorld.Source.LevelCount-1 do
begin
Level := FWorld.Source[i];
for x := 0 to Level.EdgeLength - 1 do
for y := 0 to Level.EdgeLength - 1 do
if Assigned(Level[x,y].Content) and (Level[x,y].Content.Typ=AType)
and Level[x,y].CanRemoveBlock then
begin
Result := Level[x,y].Content;
goto loopend;
end;
end;
loopend:
{ Weiterer Code }
(loopend ist vllt nicht gerade der aussagekräftigste Name für ein label, zugegeben, aber mir fiel in dem Moment nix besseres ein)
Das war wirklich einer der wenigen Anwendungsfälle, wo ein goto imo die beste, übersichtlichste Lösung darstellte. Ohne hätte man hier in jeder Schleife Result prüfen und ggf. die Schleife mit break abbrechen müssen. Höchstens hätte man eine Unterfunktion erstellen und das goto durch exit ersetzen können. Aber letzlich wäre das auch nix anderes als ein verkapptes goto gewesen und hätte zusätzlich noch Overhead durch das ganze function-begin-end-Geplänkel erzeugt und den Code auseinandergerissen.