C # метод, который перезапускает Main () - PullRequest
0 голосов
/ 17 октября 2019

У меня есть метод C #, если условие не выполняется, я хочу перезапустить метод Main (). Есть несколько постов, в которых говорится, что для этого используются циклы. GoTo также будет работать - но не используйте его. Или перезапустите приложение.

Никто не дал четкого объяснения циклам новичка.

C # пример:

public static void Method3(int userChoice){
 if(userChoice == 1){
  Console.WriteLine("do this");
 }
 else{
  Main(); // How to run the main program again from the start ?
 }
}

public static void Main(string[] args)
{
 Method1();
 int userChoice = Method2();
 Method3(userChoice);  // I want Method3 to go back to Method1() if the else statement is met.
}      

В python это действительно просто -Вы просто вызываете Main () из функции.

Ответы [ 3 ]

2 голосов
/ 17 октября 2019

Вы можете Method3() вернуть bool, чтобы метод Main() знал, стоит ли пытаться снова.

public static bool Method3(int userChoice)
{
    if (userChoice == 1)
    {
        Console.WriteLine("do this");
        return false;
    }

    return true;
}

public static void Main(string[] args)
{
    bool tryAgain;
    do
    {
        Method1();
        int userChoice = Method2();
        tryAgain = Method3(userChoice);
    } while (tryAgain);       
}

Простой повторный вызов Main() вместо цикла является другим подходом, но имеетнекоторые недостатки.

  • Вам придется как-то придумать аргумент args. Возможно, это просто пустой массив в вашем случае.
  • Это рекурсивный вызов, который влияет на трассировку стека. После стольких рекурсивных вызовов ваше приложение будет аварийно завершено.
  • Это снижает удобство обслуживания. В будущем вам придется помнить, если вы хотите добавить что-либо в начало метода Main(), из которого вы вызываете его откуда-то. Он поддается внедрению потенциально трудно диагностируемых ошибок. Использование циклического подхода инкапсулирует поведение. Из простого взгляда на Main() видно, что Method3() может вызвать еще один цикл.
1 голос
/ 17 октября 2019

Прежде всего, да, вы можете позвонить Main. Обратите внимание, что в вашем примере вам не хватает параметров args (которые будут иметь аргументы командной строки). Кроме того, также знайте, что Main возвращает, а затем выполнение продолжается после того, как вы его вызвали. Кроме того, вы, скорее всего, получите переполнение стека. Если я правильно помню, современные версии JIT могут оптимизировать хвостовую рекурсию, но я не верю, что они делают для этого конкретного случая.


Об этом объяснении цикла для новичков на уровне... это бесконечный цикл, он будет работать вечно:

while(true)
{
    // ...
}

Вы можете выйти из цикла с помощью break

while(true)
{
    // ...
    if (something)
    {
        break;
    }
    // ...
}

Или вы можете изменить это true дляусловие:

while(!something)
{
    // ...
}

Идея заключалась бы в том, чтобы обернуть Main в цикл, чтобы он продолжал работать, пока не будет выполнено условие. Вы можете иметь другой метод и вызывать его в цикле, например:

public static bool Execute()
{
    if (something)
    {
        // do whatever
        return true;
    }
    return false;
}

public static void Main(string[] args)
{
    while (!Execute())
    {
        // Empty
    }
}

Есть, конечно, другие циклы, кроме цикла while , они do ... while loop , для loop и foreach loop .


Goto будет работать? Можно утверждать. Идея состоит в том, что вы можете использовать goto для управления потоком выполнения в методе. То есть:

label:
// ...
goto label;

Приведенный выше код представляет собой бесконечный цикл. Вы можете, конечно, ввести условие:

label:
// ...
if (!something)
{
    goto label;
}
// ...

Оператор while может сделать - иногда с помощью переменной - все, что вы можете сделать с помощью goto, и обычно он легче читается и менее подвержен ошибкам.


Перезапустить процесс немного сложнее, вам нужно использовать Process.Start для запуска собственного исполняемого файла. См. Каков наилучший способ получить путь к исполняемому файлу в .NET? .

0 голосов
/ 17 октября 2019

Так что это на самом деле не сложно, но вы можете просто использовать цикл while.

C #:

public static void Main(string[] args)
{
     while(true)
     {
          Method1();
          int userChoice = Method2();
          Method3(userChoice);
     }
}

Это даст вам то, что вы хотите, и если вы хотите выйти из васпросто положи

break;
...