2016-12-10 3 views
1

Я только начинаю с C#, и здесь я сделал небольшую программу. Мне просто интересно, является ли goto действительным способом возврата к определенным разделам моего кода, или если есть более подходящий и практичный способ сделать это.Новичок C# Хорошая практика

namespace Section5Tests 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Start: 
      var number = new Random().Next(1, 10); 
      int secret = number; 

      Console.WriteLine("Secret Number is between 1 and 10. "); 
      for (var i = 0; i < 10; i++) 
      { 
       Console.WriteLine("Guess the secret number you only have 3    attempts!"); 
       Middle: 
       var guess = Convert.ToInt32(Console.ReadLine()); 

       if (guess == secret) 
       { 
        Console.WriteLine("WoW! You got it! Well done!"); 
        goto Playagain; 
       } 
       else 
       { 
        Console.WriteLine("Incorrect! Try again"); 
        goto Middle; 
       } 

      } 
      Console.WriteLine("Sorry you lost =("); 
      Playagain: 
      Console.WriteLine("Try Again? Y/N"); 
      var answer = Console.ReadLine(); 

      if (answer.ToLower() == "y") 
      { 
       goto Start; 
      } 
      else 
      { 
       Console.WriteLine("Thankyou for playing =)"); 
      } 
     } 
    } 
} 
+0

Если вам нужно спросить, вы не готовы к GOTO. Не используйте его. Вместо этого используйте петли, условия и функции. –

+1

Я писал код с середины 1980-х годов и (вне кода сборки) никогда не писал ни одного goto. Существует почти всегда лучший способ. –

+0

Ну, не стесняйтесь пролить свет на эти лучшие способы для меня –

ответ

1

Если вам нужно спросить, вы не готовы к GOTO. Не используйте его. Вместо этого используйте петли и функции.

Для начала, вместо Start:, используйте:

string answer = "y"; 
while (answer = "y") 
{ 

Конечно, вы должны закрыть эту петлю вверх вниз рядом с goto Start; заявления, но это выглядит как курсовые, поэтому я остановлюсь Вот. Это должно заставить вас идти.

+0

Спасибо за помощь –

2

В C# лучшим способом делать такие вещи было бы реорганизация программы в отдельные методы, которые имеют уникальные и описательные имена. Это гораздо лучшее решение, чем использование goto в 99,9% случаев.

Вы вообще никогда не хотите, чтобы весь ваш код находился в одном методе main. Вместо этого я бы реорганизовал игру в свой собственный метод. Затем в основном цикле вы можете только проверить, играет ли пользователь.

static void Main (string[] args) 
{ 
    var isPlaying = true; 
    while (isPlaying) 
    { 
     isPlaying = PlayGame(); 
    } 

    Console.WriteLine("Thankyou for playing =)"); 
} 

Таким образом, вы можете иметь метод PlayGame возвращают логическое значение, чтобы указать, если пользователь все еще играет. Вместо того чтобы использовать goto, вы можете контролировать поток программы с использованием контрольных переменных и смарт кодирования:

static bool PlayGame() 
{ 
    int number = new Random().Next(1, 10); 
    var userWon = false; 

    Console.WriteLine("Secret Number is between 1 and 10. "); 
    for (var numOfAttempts = 10; numOfAttempts > 0; numOfAttempts--) 
    { 
     Console.WriteLine($"Guess the secret number you only have {numOfAttempts} attempts!"); 

     var guess = Convert.ToInt32(Console.ReadLine()); 
     if (guess == number) 
     { 
      userWon = true; 
      break; 
     } 

     Console.WriteLine("Incorrect! Try again"); 
    } 

    if (userWon) 
     Console.WriteLine("WoW! You got it! Well done!"); 
    else 
     Console.WriteLine("Sorry you lost =("); 

    Console.WriteLine("Try Again? Y/N"); 
    var answer = Console.ReadLine(); 

    return answer.ToLower() == "y"; 
} 
0

интересно, если Гото является допустимым способом возвращения к определенным разделам моего кода

No, it never есть.

Только прыгающий вперед из глубоко вложенных петель, где break не будет проходить достаточно далеко, действительный. (И даже это недоволен многими ..)

Все остальные виды использования слишком сложно понять при чтении и отладке кода.

Вместо этого напишите Значимые условия в ваших петлях! И попытайтесь сосредоточиться на , что вы хотите достичь, не как ..

Ломая ваши цели сверху вниз на мелкие и простые куски работы поможет избежать приходить даже близко думать «программный поток» о и помогает думать о «решать проблемы» вместо этого.