【问题标题】:C# return does not exit the functionC# return 不退出函数
【发布时间】:2015-04-05 21:37:37
【问题描述】:

所以,我正在编写一个函数,该函数会从字典中随机询问一个问题,直到所有问题都被问完并且我遇到了问题。当随机生成的数字列表已经包含新生成的数字时,程序会调用 Ask 函数,因为它应该这样做。但是,当它到达最后的返回行时,它再次调用函数 Ask,而不是返回数字列表。

        static List<int> Ask(Dictionary<string,string> Questions, List<int> random, int count)
    {
        bool contains = false;
        var rando = new Random();
        int num = Convert.ToInt32(rando.Next(0, count));

        if (random.Count >= count)
        {
            Console.WriteLine("No more questions! Quitting");
            System.Environment.Exit(1);
        }

        foreach (int number in random)
        {
            if (number == num)
            {
                contains = true;
            }
        }

        if (contains == true)
        {
            Ask(Questions, random, count);
        }

        random.Add(num);
        var randomEntry = Questions.ElementAt(num);
        String randomKey = randomEntry.Key;
        String randomValue = randomEntry.Value;
        Console.WriteLine(randomKey);

        if (Console.ReadLine() == randomValue)
        {
            Console.WriteLine("Correct!");
        }

        else
        {
            Console.WriteLine("Wrong!");
        }
        return random;
    }

【问题讨论】:

  • 你做了哪些调试来确认这一点?您描述的行为假定您的逻辑必须正确,并且 .NET 运行时本身必须从根本上被破坏。这通常是一个无效的假设。实际上,return 语句确实退出了一个方法。否则,一切都会被破坏。
  • 只是在 VS 2013 中进行简单调试。抱歉,如果这不能回答您的问题,我仍在学习。如果有帮助,它会从 if(contains == true) 语句中调用 Ask 函数。
  • 在调试器中单步执行代码。如果containstrue,那么根据您的代码,它应该再次递归调用Ask() 函数。那么为什么你会惊讶它正在这样做呢?另外,你为什么不对调用该函数的结果做任何事情?
  • 我很惊讶,因为它会在到达返回行之后检查 if 语句。
  • 没有。它没有。代码按照读取的顺序执行。您一定误解了调试的结果和观察结果。您犯了一个错误的可能性远远远大于整个 .NET 运行时设计错误并且没有人注意到。

标签: c# return


【解决方案1】:

我认为问题在于您对函数 Ask 的递归调用。当您退出递归调用时,您仍然在 Ask 方法中的前一个调用中,并且无法避免 Ask 调用之后的其余代码。
我不认为你真的需要一个递归方法。只需检查生成的随机数是否已经在您的问题列表中,然后重复随机生成,直到找到以前未问过的问题....

这里是重构后的代码,变量名不那么混乱

List<int> Ask(Dictionary<string,string> Questions, int count)
{
    List<int> askedList = new List<int>();
    var rnd = new Random();
    int questionIndex = rnd.Next(0, count);

    while(askedList.Count < count)
    {
        if(!askedList.Any(number => number == questionIndex))
        {
           askedList.Add(questionIndex);
           var questionEntry = Questions.ElementAt(questionIndex);
           string questionText = questionEntry.Key;
           string questionAnswer = questionEntry.Value;
           Console.WriteLine(questionText);

           if (Console.ReadLine() == questionAnswer)
           {
               Console.WriteLine("Correct!");
           }
           else
           {
               Console.WriteLine("Wrong!");
           }
        }
        questionIndex = rnd.Next(0, count);
    }
    return askedList;
}

【讨论】:

  • 谢谢!奇迹般有效。只有在提出问题后我才需要退出该功能,但这并不难解决。
【解决方案2】:

你的代码有点乱。但是random var 在递归调用函数后没有更新。试试这个:

random = Ask(Questions, random, count);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2017-02-09
    • 2011-04-09
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 2019-03-24
    相关资源
    最近更新 更多