【问题标题】:how to return bool value from method如何从方法返回布尔值
【发布时间】:2011-08-04 16:54:38
【问题描述】:

我有一个循环直到 bool done = true; 在 TestMoves() 方法中,根据用户输入,该方法将 bool done 返回为 true 或 false。但是,我不知道如何在我的 Start() 方法中将此值“发送”回 while 循环以停止循环。这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {


        public static void Main(string[] args)
        {
            Start("r");
        }

        public static string Start(string move)
        {

            Console.Write("Welcome to the Shotgun App\nEnter s for single player and m for multiplayer: ");
            string gameType = Console.ReadLine();

            if (gameType == "s")
            {

                Console.Write("Single Player Controls:\n r = reload\n s = shield\n f = fire\n ***you start with ammo\n Ready to play?");
                Console.ReadLine();

                int ammo = 1;

                bool done = false;
                while (!done)
                {
                    Console.Write("\nEnter your move: ");
                    move = Console.ReadLine();


                    switch (move)
                    {
                        case "r":
                            Console.Write("\nYou have reloaded, press enter for Genius\n");

                            ammo++;
                            Console.Write("Your ammo is " + ammo);

                            Console.ReadLine();

                            string geniusMove = "";
                            Genius(geniusMove, move, done);
                            Console.ReadLine();




                            break;
                        case "s":
                            Console.Write("\nYou have shielded, press enter for Genius\n");

                            Console.Write("Your ammo is " + ammo);

                            Console.ReadLine();

                            geniusMove = "";
                            Genius(geniusMove, move, done);
                            Console.ReadLine();




                            break;
                        case "f":
                            if (ammo != 0)
                            {
                                Console.Write("\nYou have fired, press enter for Genius\n");

                                ammo--;
                                Console.Write("Your ammo is " + ammo);

                                Console.ReadLine();

                                geniusMove = "";
                                Genius(geniusMove, move, done);
                                Console.ReadLine();
                            }
                            else
                            {
                                Console.Write("You don't have enough ammo, try again");
                                done = false;
                            }
                            break;
                        default:
                            Console.Write("\nInvalid move, try again\n");
                            done = false;
                            break;
                    }


                }
                return move;
            }
            else
            {
                return move;
            }
        }

        static string Genius(string geniusMove, string move, bool done)
        {
            int geniusAmmo = 1;

            geniusMove = "r";
            if (geniusMove == "f")
            {

                geniusAmmo--;
                Console.Write("Genius had decided to fire.\nGenius ammo is " + geniusAmmo + "\n");
            }
            else if (geniusMove == "r")
            {

                geniusAmmo++;
                Console.Write("Genius had decided to reload.\nGenius ammo is " + geniusAmmo + "\n");
            }
            else if (geniusMove == "s")
            {
                Console.Write("Genius had decided to shield.\nGenius ammo is " + geniusAmmo + "\n");
            }
            TestMoves(move, geniusMove, done);
            return geniusMove;
        }


        static bool TestMoves(string move, string geniusMove, bool done)
        {

            if (move == "s" && geniusMove == "f")
            {
                Console.Write("No one has died yet");
                done = false;
                return done;
            }
            else if (move == "f" && geniusMove == "f")
            {
                Console.Write("You both died!  Good game!");
                done = true;
                return done;
            }
            else if (move != "s" && geniusMove == "f")
            {
                Console.Write("You died!  Good game!");
                done = true;
                return done;
            }
            else if (move == "f" && geniusMove == "s")
            {
                Console.Write("No one has died yet");
                done = false;
                return done;
            }
            else if (move == "f" && geniusMove != "s")
            {
                Console.Write("Genius died!  Good game!");
                done = true;
                return done;
            }
            else if (move != "f" && geniusMove != "f")
            {
                Console.Write("No one has died yet");
                done = false;
                return done;
            }
            else
            {
                return done;
            }

        }
    }
}

【问题讨论】:

  • 你为什么给一个变量赋值,只是为了返回它?只需在 TestMoves 中使用 return falsereturn true...

标签: c# .net while-loop


【解决方案1】:

您是否有理由需要从 Genius 内部而不是从循环中调用 TestMoves?在我看来,您的代码可以这样重写:

//Every instance of:

string geniusMove = "";
Genius(geniusMove, move, done);
Console.ReadLine();

//seems like it could be rewritten as:

string geniusMove = "";
Genius(geniusMove, move, done);
done = TestMoves(geniusMove, move, done);
Console.ReadLine();
//and then you can remove the call to TestMoves from Genius

所有代码的整体流程让我有点困惑。您让每个函数都返回一个值,但似乎没有对返回值做任何事情。我有一种感觉,通过一些重构,您可以使这段代码更短、更合乎逻辑。

在仔细查看您的代码之后,您似乎可以在循环的最后调用 TestMoves:

                    default:
                        Console.Write("\nInvalid move, try again\n");
                        done = false;
                        break;
                }

                //add it here:
                done = TestMoves(geniusMove, move, done);

            }
            return move;

【讨论】:

  • 非常感谢,这个组织更合乎逻辑
【解决方案2】:

你可以通过 ref 传递值:

static string Genius(string geniusMove, string move, ref bool done) ...

然后从TestMoves返回:

static bool TestMoves(string move, string geniusMove) ...

称呼它:

Genius(geniusMove, move, ref done);

【讨论】:

    【解决方案3】:

    由于bool 是值类型,而不是引用类型,因此您无法像那样传递布尔值。使用 out 关键字明确指定您希望将其作为引用传递:

    http://msdn.microsoft.com/en-us/library/ee332485.aspx

    【讨论】:

    • bool 不必是作为引用传递的引用类型。 static void TestRef(ref bool b){b = !b;} 编译得很好......并且当我调用它时会做我期望的事情。 out 和 ref 的区别在于,ref 传递的参数必须在函数调用之前初始化,而 out 传递的值必须在被调用的方法内部初始化。
    • @Vladislav Hubrid not 在他的方法参数中有ref。他是使用out 还是ref 都没有关系,但像在他的示例代码中那样简单地通过值传递它是行不通的。
    • 非常抱歉 - 我是在讨论 ref 与 out 的背景下阅读它的。这在很大程度上是我的错误-在问题的上下文中,您的答案是完全正确的。
    【解决方案4】:

    您可以在done 参数上使用refout 关键字

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-27
      • 2012-11-03
      • 1970-01-01
      • 2021-11-27
      • 2015-09-10
      • 2012-11-04
      • 2015-06-18
      相关资源
      最近更新 更多