62 votes

Comment échapper à une boucle while en C#

J'essaie d'échapper à une boucle while. En fait, si la condition "if" est remplie, j'aimerais pouvoir sortir de cette boucle :

private void CheckLog()
{
    while (true)
    {
        Thread.Sleep(5000);
        if (!System.IO.File.Exists("Command.bat"))
            continue;

        using (System.IO.StreamReader sr = System.IO.File.OpenText("Command.bat"))
        {
            string s = "";
            while ((s = sr.ReadLine()) != null)
            {
                if (s.Contains("mp4:production/CATCHUP/"))
                {
                    RemoveEXELog();

                    Process p = new Process();
                    p.StartInfo.WorkingDirectory = "dump";
                    p.StartInfo.FileName = "test.exe";
                    p.StartInfo.Arguments = s;
                    p.Start();

                    << Escape here - if the "if" condition is met, escape the loop here >>
                }
            }
        }
    }
}

1voto

Jeremy Points 3511

"break" est une commande qui permet de sortir de la boucle "la plus proche".

Bien qu'il y ait beaucoup de bonnes utilisations de break, vous ne devriez pas l'utiliser si vous n'y êtes pas obligé - il peut être considéré comme une autre façon d'utiliser goto, qui est considéré comme mauvais.

Par exemple, pourquoi pas :

while (!(the condition you're using to break))
        {
         //Your code here.
        }

Si la raison pour laquelle vous utilisez "break" est que vous ne voulez pas poursuivre l'exécution de cette itération de la boucle, vous pouvez utiliser le mot-clé "continue", qui passe immédiatement à l'itération suivante de la boucle, qu'il s'agisse de while ou de for.

while (!condition) {
   //Some code
   if (condition) continue;
   //More code that will be skipped over if the condition was true
}

0voto

Kevin Points 1624

Désolé pour le necro-add, mais il y a quelque chose que je voulais vraiment insérer et qui manque dans les réponses existantes (pour tous ceux qui, comme moi, tombent sur cette question via google) : refactorez votre code. Non seulement cela le rendra plus facile à lire/maintenir, mais cela supprimera souvent ces types de problèmes de routage de contrôle.

Voici ce vers quoi je me tournerais si je devais programmer la fonction ci-dessus :

private const string CatchupLineToIndicateLogDump = "mp4:production/CATCHUP/";
private const string BatchFileLocation = "Command.bat";

private void CheckLog()
{
    while (true)
    {
        Thread.Sleep(5000);
        if (System.IO.File.Exists(BatchFileLocation))
        {
            if (doesFileContainStr(BatchFileLocation, CatchupLineToIndicateLogDump))
            {
                RemoveLogAndDump();
                return;
            }
        }
    }
}

private bool doesFileContainStr(string FileLoc, string StrToCheckFor)
{
  // ... code for checking the existing of a string within a file
  // (and returning back whether the string was found.)
}

private void RemoveLogAndDump()
{
  // ... your code to call RemoveEXELog and kick off test.exe
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X