【问题标题】:C# How to make use of return true/false from a method (outside of loop) called from within a while loopC#如何利用从while循环内调用的方法(循环外)返回true/false
【发布时间】:2020-07-28 11:53:34
【问题描述】:

我正在尝试编写一个程序,让我将名称列表及其各自的电影评级输入到数组中(会做一个列表,但课程材料希望我使用数组)。在将名称添加到数组之前,我想确保输入了有效的评级。

我目前正在使用一个循环遍历数组长度并让用户以这种方式将每部电影输入到列表中的 for 语句。这发生在 while 循环中,如果在将名称提交给 Array 之前评级无效,则使他们重新输入名称。我通过调用一个带有当前输入名称和评级的临时字符串的方法来检查名称,该方法将执行一些条件检查并根据结果返回 false 或 true。但是我这样做的方式根本不起作用..

问题是我不知道如何实际使用我的方法返回的 bool 语句:

string[] filmNames = new string[ArrayLength];
                    for (int i = 0; i < filmNames.Length; i = i + 1)
                    {
                        bool ratingFail = true;
                        int displayNumber = i + 1;
                        while (ratingFail)
                        {
                            Console.Write($"> Enter the Name and Rating of film number {displayNumber} of {ArrayLength}: ");
                            string checkRating = Console.ReadLine();
                            CheckRating(checkRating); // currently just does "return false;" for testing purposes
                            if (true) // this statement is clearly not effected by whatever the return value is from above method. Why? What to do?
                            {
                                ratingFail = true;
                            }
                            else
                            {   
                                filmNames[i] = checkRating; // this bit is marked as unreachable, which is is.
                                ratingFail = false;
                            }
                        }
                    }

我的测试方法:

public static bool CheckRating(string checkRating)
        {
            return false;
        }

我对编程和 C# 非常陌生(一周),所以在回答时请记住,我可能不理解特定的术语,这些术语指的是您在此处可以看到的范围之外的编程术语,但我会在 Google 和如果无法简化您想说的话,请尽我所能进行研究。感谢您的时间和精力。

【问题讨论】:

  • 你没有测试 CheckRating() 的返回值。

标签: c# return-value


【解决方案1】:
if (true) // this statement is clearly not effected by whatever the return value is from above method. Why? What to do?
    {
        ratingFail = true;
    }

这将永远是正确的,因为您正在创建一个始终正确的变量。你想要这个:

ratingFail = CheckRating(checkRating)
if (!ratingFail) {
    The rating is valid, do stuff here.
}

如果 ratingFail 为真,则循环将继续。

这假设 CheckRating 如果输入无效则返回 true,如果输入有效则返回 false。这里的变量命名比较混乱,建议你重构一下。

我会这样做,假设 CheckRating 如果有效则返回 true:

for (int i = 0; i < filmNames.Length; i = i + 1)
{
    bool ratingValid; // Defaults to false
    int displayNumber = i + 1;
    while (!ratingValid)
    {
        Console.Write($"> Blablabla: ");
        string input = Console.ReadLine();
        ratingValid = CheckRating(input);
    }
    // Do stuff if rating is valid here. If you got here, rating is valid.
}

// 由 iluvpancakes 编辑 // 我决定添加@Sinatr 的评论,因为那是我个人最终使用的(版本)解决方案:

    if(CheckRating(checkRating))
    {
        [do stuff and things]
    }

【讨论】:

    【解决方案2】:
    bool ret = CheckRating(checkRating); // currently just does "return false;" for testing purposes
    
    if (ret)
    {
        [...]
    }
    

    或者,就像 Sinatr 的评论:

    if(CheckRating(checkRating))
    {
        [...]
    }
    

    【讨论】:

    • 也许作为补充扩展 CheckRating 有一个尝试解析数字(因此返回正确的布尔值)。可能会更清楚。
    • @ElmoDev001 那么返回值分配给我在参数中使用的字符串?如果是这样,我该如何使用 filmNames [i] = checkRating ?我在这里错过了什么?
    • 不,在这种情况下不是。您正在此处创建一个新变量,返回值为 false,但您没有捕捉到此结果。使用 bool ret = CheckRating(checkRating),'ret' 将包含 checkrating 所做的任何事情的结果。然后在下一个 if 语句中替换 if(ret),它基本上等于 if(ret == true)。 if(!ret) 将是 if(ret != true) (false..)
    猜你喜欢
    • 2020-08-08
    • 2016-10-28
    • 2013-06-07
    • 2017-11-09
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多