Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#无法保存struct变量的值_C#_Struct_Public - Fatal编程技术网

C#无法保存struct变量的值

C#无法保存struct变量的值,c#,struct,public,C#,Struct,Public,我试图写一个框架程序,让你玩德州扑克。我的函数hasPair有问题,该函数决定CurrentPlayer是否有一对: public bool hasPair(Player CurrentPlayer) { bool flag; Card[] SevenCards = new Card[7]; SevenCards[0].Color = CurrentPlayer.Card1.Color;

我试图写一个框架程序,让你玩德州扑克。我的函数
hasPair
有问题,该函数决定
CurrentPlayer
是否有一对:

  public bool hasPair(Player CurrentPlayer)
        {
            bool flag;
            Card[] SevenCards = new Card[7];

            SevenCards[0].Color = CurrentPlayer.Card1.Color;
            SevenCards[0].Number = CurrentPlayer.Card1.Number;
            SevenCards[1].Color = CurrentPlayer.Color2;
            SevenCards[1].Number = CurrentPlayer.Number2;

            SevenCards[2] = Ground.Card1;
            SevenCards[3] = Ground.Card2;
            SevenCards[4] = Ground.Card3;
            SevenCards[5] = Ground.Card4;
            SevenCards[6] = Ground.Card5;

            flag = isThere_Pair(SevenCards); 

            return flag;
        }
下面是
CurrentPlayer
接收卡的方式:

    public void Deal_Cards(Player Player)
    {
        int Color1, No1, Color2, No2;

        while (true)
        {


        dealhelper1:

            Color1 = (RandomColor.Next() % 4);
            No1 = ((RandomNo.Next() % 13));


            if (CardDeck[Color1, No1].isChosen == true)
            {
                goto dealhelper1;
            }

            if (CardDeck[Color1, No1].isChosen == false)
            {
                Player.Card1.Color = Color1;

                Player.Card1.Number = No1+1;
                Player.Card1.imagePath = CardDeck[Color1, No1].imagePath;

                Player.Color1 = CardDeck[Color1, No1].Color;
                Player.Number1 = CardDeck[Color1, No1].Number;                   

                CardDeck[Color1, No1].isChosen = true;
                break;
            }
        }

        while (true)
        {
            dealhelper2:

            Color2 = (RandomColor.Next() % 4);
            No2 = ((RandomNo.Next() % 13));

            if (CardDeck[Color2, No2].isChosen == true)
            {
                goto dealhelper2;
            }

            if (CardDeck[Color2, No2].isChosen == false)
            {
                CardDeck[Color2, No2].isChosen = true;


                Player.Card2.Color = Color2;
                Player.Card2.Number = (No2)+1;

                Player.Color2 = CardDeck[Color2, No2].Color;
                Player.Number2 = CardDeck[Color2, No2].Number;
                break;
            }
        }

        display_Player_Cards(Player);
    }
但是在
hasPair
函数中,
CurrentPlayer
的牌号和颜色为0。我尝试了不同的方法,但当我在查询中询问时,我无法获得玩家卡的数字值,尽管它们已由
Deal\u cards
函数初始化。不过地面的牌没有问题

有趣的是,
display\u Player\u Cards(Player)
功能工作正常(因此它成功获取值并显示卡)

我使用类型为
Player
(struct)的公共变量,如:

为什么他们不能坚持自己的价值观?我如何解决这个问题?
谢谢您的帮助。

您在这里遇到的问题是结构是通过.Net中的值传递的。因此,
Deal\u Cards
方法接收
Player
实例的副本,并将卡分配给该副本。传递给
交易卡的原始值未经修改


要解决此问题,您需要将
Player
a
class
或通过引用传递它。我强烈推荐制作
Player
a
class
。拥有易变结构只是一条痛苦之路,很难找到像这样的bug

您在这里遇到的问题是,结构是通过.Net中的值传递的。因此,
Deal\u Cards
方法接收
Player
实例的副本,并将卡分配给该副本。传递给
交易卡的原始值未经修改


要解决此问题,您需要将
Player
a
class
或通过引用传递它。我强烈推荐制作
Player
a
class
。拥有易变结构只是一条痛苦之路,很难找到像这样的bug

在C中,通过值传递结构有效地将结构的副本提供给被调用的例程;无论例程如何处理其结构副本,调用方结构的字段都不会受到影响。如果希望调用的函数能够修改结构,则必须将其设置为“ref”参数

请注意,作为ref参数传递结构比传递类对象引用具有更严格的语义。给予类对象引用的例程不仅可以使用该引用执行它想执行的任何操作,还可以使其他代码可以随时执行它想执行的任何操作,即使在最初给予该引用的函数返回后也是如此。相反,作为ref参数给定结构的例程在返回之前可以对结构执行任何操作,但在返回后它将无法直接或间接修改结构的字段


您没有显示“Player”数据类型的内容,因此不清楚它应该是结构还是类。然而,玩家的手似乎是结构的合理候选,因为它只持有两张牌。让它成为一个可变类对我来说真的很讨厌。你可以使玩家的手成为一个不可变的结构,并用返回
玩家手
结构的
生成和
函数替换
发牌
方法,或者将
玩家手
作为ref参数传递给
发牌
。如果采用“不可变”路线,可以使用类,但我认为在这种情况下使用不可变类而不是不可变结构没有什么好处。

在C中,通过值传递结构有效地将结构的副本提供给被调用的例程;无论例程如何处理其结构副本,调用方结构的字段都不会受到影响。如果希望调用的函数能够修改结构,则必须将其设置为“ref”参数

请注意,作为ref参数传递结构比传递类对象引用具有更严格的语义。给予类对象引用的例程不仅可以使用该引用执行它想执行的任何操作,还可以使其他代码可以随时执行它想执行的任何操作,即使在最初给予该引用的函数返回后也是如此。相反,作为ref参数给定结构的例程在返回之前可以对结构执行任何操作,但在返回后它将无法直接或间接修改结构的字段


您没有显示“Player”数据类型的内容,因此不清楚它应该是结构还是类。然而,玩家的手似乎是结构的合理候选,因为它只持有两张牌。让它成为一个可变类对我来说真的很讨厌。你可以使玩家的手成为一个不可变的结构,并用返回
玩家手
结构的
生成和
函数替换
发牌
方法,或者将
玩家手
作为ref参数传递给
发牌
。如果选择“不可变”路线,则可以使用类,但我认为在这种情况下使用不可变类而不是不可变结构没有什么好处。

尝试调试它,看看您的
Deal\u Cards
方法是否完成了执行。那些
while(true)
循环非常非常危险。如果它从未完成执行,那么您可能已经找到了为什么字段都为零的答案。请尝试调试它,看看您的
Deal\u Cards
方法是否完成了执行。那些
while(true)
循环非常非常危险。如果它从未完成执行,那么您可能已经找到了为什么字段都为零的答案。
    public Player P1 = new Player();
    public Player AI = new Player();