初学者C#良好实践

时间:2016-12-10 01:47:04

标签: c#

我刚刚开始使用c#,我在这里做了一个小程序。我只是想知道goto是否是返回我的代码的某些部分的有效方式,或者是否有更合适和实用的方法。

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 =)");
            }
        }
    }
}

4 个答案:

答案 0 :(得分:2)

在C#中,更好的做法是将程序重构为具有唯一和描述性名称的单个方法。这比99.9%的情况下使用goto要好得多。

您通常不希望所有代码都使用单个main方法。相反,我会将游戏本身重构为自己的方法。然后,在主循环中,您只能检查用户是否正在播放。

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

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

这样,你可以让PlayGame方法返回一个bool来指定​​用户是否还在玩。您可以使用检查变量和智能编码来控制程序的流程,而不是使用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";
}

答案 1 :(得分:1)

如果你不得不问,你还没有为GOTO做好准备。不要使用它。请改用循环和函数。

为了让您入门,而不是Start:,请使用:

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

当然,您需要在goto Start;声明附近向上关闭该循环,但这看起来像是课程作业所以我会停在这里。这应该让你去。

答案 2 :(得分:0)

  

想知道goto是否是返回到某些部分的有效方式   我的代码

从不

只有{strong>向前跳出深层嵌套循环,其中break不够远,才有效。 (甚至连许多人也不赞同......)

在阅读和调试代码时,所有其他用途都难以理解。

而是在循环中写下有意义的条件!并尝试专注于你想要实现的 ,而不是如何 ..

将您的目标自上而下分解为小而简单的工作块将有助于避免接近考虑'程序流'并帮助思考'解决问题'而不是。

答案 3 :(得分:0)

我希望与其他答案有所不同。因此,我在if语句中添加了if else语句以替换goto()函数。这是一个很长的路要走,但是我希望它很容易理解。

*.example.com