【问题标题】:C# alternative for ref/out parameters in multiple methods多种方法中 ref/out 参数的 C# 替代方案
【发布时间】:2016-02-03 18:42:34
【问题描述】:

我有很多将ref/out 作为参数的方法。我这样做是因为我在创建方法的类中声明了我的变量。现在我将变量移到单独的类中,我无法正确地将变量作为 ref/out 参数传递。那么我应该怎么做呢?这些方法需要很多参数,并且在某些时候都需要它们。所以也许返回一个元组是解决方案,但我听说返回一个包含很多变量的元组根本不好(我不确定这是否适用于 .net 4.5 框架)。我将在这里只发布其中的一些方法,因为其中有超过 25 个。

private void SetPlayers(int start, int end, Panel panel, int chips, int turn, ref bool check, int newHorizontal, int newVertical, AnchorStyles one, AnchorStyles two)
    {
        if (chips > 0)
        {
            foldedPlayers--;
            if (turn < start || turn > end) return;
            if (Holder[start].Tag != null)
            {
                Holder[end].Tag = Reserve[end];
            }
            Holder[start].Tag = Reserve[start];
            if (!check)
            {
                horizontal = newHorizontal;
                vertical = newVertical;
            }
            check = true;
            Holder[turn].Anchor = (one | two);
            Holder[turn].Image = backImage;
            //Holder[turn].Image = Deck[i];
            Holder[turn].Location = new Point(horizontal, vertical);
            horizontal += Holder[turn].Width;
            Holder[turn].Visible = true;
            Controls.Add(panel);
            panel.Location = new Point(Holder[start].Left - 10, Holder[start].Top - 10);
            panel.BackColor = Color.DarkBlue;
            panel.Height = _settings.Height + 20;
            panel.Width = (_settings.Width + 10) * 2;
            panel.Visible = false;
            if (i == end)
            {
                check = false;
            }
        }
    }

我认为这实际上可能是用元组完成的:

private void Combinations(int c1, int c2, ref int current, ref int power, Control lFold)
    {

        for (i = 0; i < 16; i++)
        {
            if (Reserve[i] == int.Parse(Holder[c1].Tag.ToString()) &&
                Reserve[i + 1] == int.Parse(Holder[c2].Tag.ToString()))
            {
                RHighCard(ref current, ref power);

                RPairFromTable(ref current, ref power);

                RPairInHand(ref current, ref power);

                RPairFromHand(ref current, ref power);

                RTwoPairFromTable(ref current, ref power);

                RHandTableTwoPair(ref current, ref power);

                RTableHandTwoPair(ref current, ref power);

                RTwoPair(ref current, ref power);

                RThreeOfAKind(ref current, ref power, straight);

                RStraight(ref current, ref power, straight);

                RFlush(ref current, ref power, straight1);

                RFullHouse(ref current, ref power, ref done, straight);

                RFourOfAKind(ref current, ref power, straight);

                RStraightFlush(ref current, ref power, st1, st2, st3, st4);
            }
        }
    }

我将只发布其中的一些方法。它们都以相同的方式改变功率和电流:

private void RHighCard(ref int current, ref int power)
    {
        if (current != -1) return;
        current = -1;
        power = Kicker;
        Win.Add(new Type { Power = power, Current = current });
    }

private void RPairFromTable(ref int current, ref int power)
    {
        if (current != -1) return;
        for (int tc = 16; tc >= 12; tc--)
        {
            int max = tc - 12;
            for (int k = 1; k <= max; k++)
            {
                if (tc - k < 12)
                {
                    max--;
                }
                if (tc - k < 12) continue;
                if (Reserve[tc] / 4 == Reserve[tc - k] / 4 && Reserve[tc] / 4 == 0)
                {
                    current = 0;
                    power = 13 + Kicker;
                    Win.Add(new Type { Power = power, Current = current });
                }
                else if (Reserve[tc] / 4 == Reserve[tc - k] / 4 && Reserve[tc] / 4 != 0)
                {
                    current = 0;
                    power = Reserve[tc] / 4 + Kicker;
                    Win.Add(new Type { Power = power, Current = current });
                }
            }
        }
    }

再次,我必须将类属性作为输入传递给这些方法,并且它不会返回编辑的值,这是主要问题。欢迎任何替代方案。

还有一些关于我的类变量的信息:

public class UsersProperties
{
    public int Chips;
    public int Type;
    public int Power;
    public bool Turn;
    public bool FoldTurn;
    public AnchorStyles CardsAnchor;
    public readonly Panel Panel = new Panel();
}

public class Player : UsersProperties
{
    public Player()
    {
        Chips = 100000;
        Type = -1;
        Power = 0;
        Turn = true;
        FoldTurn = false;
        CardsAnchor = AnchorStyles.Bottom;

    }
 }

【问题讨论】:

    标签: c# class properties tuples ref


    【解决方案1】:

    除了如您所指出的返回元组之外,您还可以将带有变量的类的实例传递给方法,然后在这些类上设置属性或调用方法以在方法中设置变量值。

    private void SetPlayers(..., MyClass myInstance)
    {
      ....
       myInstance.Check = true;
      ....
     }
    

    或者,也可以使用 get 和 set 属性定义一个类或结构来保存返回的数据,然后从您的方法中返回该类的一个实例。

    class SetPlayerData
    {
      public bool Check {get; set;}
      public SetPlayerData(bool check) { this.Check = check;}
    }
    
      private SetPlayerData SetPlayers(...)
    {
      ....
       SetPlayerData data = new SetPlayerData(true);
      ....
      return data; 
    }
    

    【讨论】:

    • 您是否要在 Player 实例上设置值?
    • 老实说,我真的对你的代码中发生的事情感到困惑
    • 其实并不复杂。
    猜你喜欢
    • 2017-07-15
    • 2021-07-03
    • 2020-09-23
    • 2023-03-17
    • 2013-03-16
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    相关资源
    最近更新 更多