C# 如何将数据传递给其他类中的方法?

C# 如何将数据传递给其他类中的方法?,c#,methods,arguments,parameter-passing,C#,Methods,Arguments,Parameter Passing,说到编程,我还是个傻瓜,我决定要测试我的极限,创造一个井字游戏。我相信有很多更好的方法来做我想做的事情,但我只是还在学习。在测试到目前为止所做的工作时,我遇到了这样一个问题:要求用户输入一个位置(位置为1-9,这些位置最终将用于告诉程序将用户X或O放置在何处)。我现在有两个班,主班和董事会班。在通过放置一个停止标记进行了一点调试之后,我逐渐意识到,当我从我的主类中的board类调用一个方法时,放入该方法的参数中的数据不会继续 主要类别: class Program { stati

说到编程,我还是个傻瓜,我决定要测试我的极限,创造一个井字游戏。我相信有很多更好的方法来做我想做的事情,但我只是还在学习。在测试到目前为止所做的工作时,我遇到了这样一个问题:要求用户输入一个位置(位置为1-9,这些位置最终将用于告诉程序将用户X或O放置在何处)。我现在有两个班,主班和董事会班。在通过放置一个停止标记进行了一点调试之后,我逐渐意识到,当我从我的主类中的board类调用一个方法时,放入该方法的参数中的数据不会继续

主要类别:

class Program {
        static void Main(string[] args) {
            Board board = new Board();

            bool hasWon = false;

            string p1;
            string p2;
            string pos;
            int turn = 2;

            Console.Write("Please enter a name for player 1: ");
            p1 = Console.ReadLine();
            Console.Clear();
            Console.Write("Please enter a name for player 2: ");
            p2 = Console.ReadLine();
            Console.Clear();

            while (hasWon == false) {
                if (turn % 2 == 0) {
                    Console.WriteLine(p1 + "'s Turn / You are X's");
                    board.DisplayBoard();
                    Console.WriteLine();
                    Console.WriteLine("Please selecet a position: ");
                    board.SetPos(Console.ReadLine());

                    Console.WriteLine("Position correctly set: " + board.GetPos());
                } else {
                    Console.WriteLine(p2 + "'s Turn / You are O's");
                    board.DisplayBoard();
                    Console.WriteLine();
                    Console.WriteLine("Please selecet a position: ");
                    board.SetPos(Console.ReadLine());

                    Console.WriteLine("Position correctly set: " + board.GetPos());
                }
            }
        }
    }
董事会级别:

public class Board {

        private string pos = "";
        private string badPos = "";
        public void DisplayBoard() {
            Console.WriteLine(" 1 | 2 | 3 ");
            Console.WriteLine("-----------");
            Console.WriteLine(" 4 | 5 | 6");
            Console.WriteLine("-----------");
            Console.WriteLine(" 7 | 8 | 9 ");
        }

        public void SetPos(string pos) {
            if (this.pos.Length > 1 || this.pos.Length < 1) {
                this.pos = badPos;
                IncorrectPosition();
            } else if (!this.pos.Contains("1") || this.pos.Contains("2") || this.pos.Contains("3") || this.pos.Contains("4") ||
                this.pos.Contains("5") || this.pos.Contains("6") || this.pos.Contains("7") || this.pos.Contains("8") ||
                this.pos.Contains("9")) {
                this.pos = badPos;
                IncorrectPosition();
            } else {
                this.pos = pos;
            }
        }

        public string GetPos() {
            return pos;
        }

        /*public void setTurn(int turn) {
            turn = this.turn;
        }*/

        private void IncorrectPosition() {
            Console.Clear();
            Console.WriteLine(badPos + " is not a correct position");
            Console.Write("Please enter a position: ");
            SetPos(Console.ReadLine());
        }

    }
公共课程委员会{
私有字符串pos=“”;
私有字符串badPos=“”;
公共显示板(){
Console.WriteLine(“1 | 2 | 3”);
Console.WriteLine(“--------------”);
Console.WriteLine(“4 | 5 | 6”);
Console.WriteLine(“--------------”);
Console.WriteLine(“7 | 8 | 9”);
}
公共无效设置位置(字符串位置){
如果(this.pos.Length>1 | | this.pos.Length<1){
this.pos=badPos;
位置不正确();
}否则,如果(!this.pos.Contains(“1”)| | this.pos.Contains(“2”)| | this.pos.Contains(“3”)| | this.pos.Contains(“4”)||
this.pos.Contains(5)this.pos.Contains(6)this.pos.Contains(7)this.pos.Contains(8)||
此位置包含(“9”)){
this.pos=badPos;
位置不正确();
}否则{
this.pos=pos;
}
}
公共字符串GetPos(){
返回pos;
}
/*公共无效设置回合(整数回合){
turn=this.turn;
}*/
私有无效不正确位置(){
Console.Clear();
控制台写入线(badPos+“位置不正确”);
控制台。写入(“请输入位置:”);
SetPos(Console.ReadLine());
}
}
更具体地说,这个问题发生在主课堂上。当要求用户输入职位时,他们通过输入数字1-9来完成。在Board类中,有一个名为SetPos的方法,该方法将用于确定稍后在开发X或O时放置X或O的位置。但是,我还有一个方法可以确保用户输入的是数字1-9。我不想把它转换成一个整数,我希望它保持一个字符串。每当用户为该位置输入任何内容时,都不会有任何内容结转。当使用停止标记并一步一步地查看程序时,在观察列表中,我可以看到哪些值被分配给哪些变量,我的pos变量确实被分配给我输入的变量,但随后丢失,从而重复SetPos和不正确的位置。当控制台显示不正确位置时,显示

位置不正确
请输入一个职位:

在SetPos()方法中,我尝试了一些方法来解决这个问题,其中之一是我添加了一个badPos变量,这意味着如果if语句中的前两项中的任何一项为true,那么在我的主类中通过SetPos()方法传递的值将被分配给badPos,但是当打印到控制台时,屏幕上没有显示任何值,这是告诉我从未分配过值的另一种方式


我不知道如何解决这个问题,任何帮助都将不胜感激,谢谢

如果(this.pos.Length>1 | | this.pos.Length<1)
您正在检查
this.pos
(类字段),而您应该检查
pos
(函数参数)。(对于初学者来说,当然还有很大的改进空间。但这是主要故障。)顺便说一句:你永远不会改变
turn
haswun
。所以你的玩家1将永远玩下去。。。但我猜,你计划在修复了上面的错误后再做这个,对吗?到目前为止,你的整个
Board
课程没有多大意义。@Fildor只是为了让我更好地理解,为什么检查这个.pos.Length不起作用?在检查用户传递的位置值并确保其确实是正确位置之前,board类中的pos变量不会被赋值。如果我改为检查pos变量,而不是this.pos,它不会仍然显示为空吗?(再一次,这只是为了让我能够进一步理解为什么它会这样工作。)是的,我还没有实现任何赢得或切换转弯的方法。在我继续之前,我主要想解决这个问题。好吧,您回答了自己的问题:“board类中的pos变量在用户传递的位置值被选中之前不会被赋值”,只是您没有检查传递的位置值。您检查board类的position字段,据您所知,该字段尚未设置。就目前而言,永远不会
this.pos
是board类的pos字段,而不是方法参数。您可以通过将参数重命名为其他参数来轻松检查这一点。顺便说一句:我刚才看到你递归地处理一个无效的条目。我不认为这是一个特别糟糕的问题在这种情况下。但是你应该考虑使用一个循环来代替。如果在没有用户交互的设置中使用这样的构造,并且递归深度不断增加,那么可能会导致堆栈溢出。