多个方法中 ref/out 参数的 C# 替代方案
C# alternative for ref/out parameters in multiple methods
我有很多方法将ref/out
作为参数。我这样做是因为我在 class 中声明了我的变量,我正在创建 methods.Now 我移动到变量来分隔 classes 并且我不能将变量作为 ref/out 参数 properly.So 我应该怎么做?这些方法需要很多参数,并且在某些时候都需要它们。所以也许 returning 一个元组是解决方案,但我听说 returning 元组里面有很多变量它一点都不好(我不确定这是否适用于 .net 4.5 框架).我将 post 这里只是其中的一些方法,因为它们有超过 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);
}
}
}
我将只post其中的一些方法。它们都以相同的方式改变功率和电流:
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 });
}
}
}
}
同样,我必须传递一个 class 属性 作为这些方法的输入,它不会 return 编辑的值,这是主要问题。欢迎任何替代方案。
还有一些关于我的 class 变量的信息:
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;
}
}
除了 return 元组之外,您还可以将带有变量的 classes 的实例传递给方法,然后在这些 [=] 上设置属性或调用方法16=]es 在方法中设置变量值。
private void SetPlayers(..., MyClass myInstance)
{
....
myInstance.Check = true;
....
}
或者,也可以定义一个 class 或具有 get 和 set 属性的结构来保存 returned 数据,然后 return 那个 class 的实例你的方法。
class SetPlayerData
{
public bool Check {get; set;}
public SetPlayerData(bool check) { this.Check = check;}
}
private SetPlayerData SetPlayers(...)
{
....
SetPlayerData data = new SetPlayerData(true);
....
return data;
}
我有很多方法将ref/out
作为参数。我这样做是因为我在 class 中声明了我的变量,我正在创建 methods.Now 我移动到变量来分隔 classes 并且我不能将变量作为 ref/out 参数 properly.So 我应该怎么做?这些方法需要很多参数,并且在某些时候都需要它们。所以也许 returning 一个元组是解决方案,但我听说 returning 元组里面有很多变量它一点都不好(我不确定这是否适用于 .net 4.5 框架).我将 post 这里只是其中的一些方法,因为它们有超过 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);
}
}
}
我将只post其中的一些方法。它们都以相同的方式改变功率和电流:
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 });
}
}
}
}
同样,我必须传递一个 class 属性 作为这些方法的输入,它不会 return 编辑的值,这是主要问题。欢迎任何替代方案。
还有一些关于我的 class 变量的信息:
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;
}
}
除了 return 元组之外,您还可以将带有变量的 classes 的实例传递给方法,然后在这些 [=] 上设置属性或调用方法16=]es 在方法中设置变量值。
private void SetPlayers(..., MyClass myInstance)
{
....
myInstance.Check = true;
....
}
或者,也可以定义一个 class 或具有 get 和 set 属性的结构来保存 returned 数据,然后 return 那个 class 的实例你的方法。
class SetPlayerData
{
public bool Check {get; set;}
public SetPlayerData(bool check) { this.Check = check;}
}
private SetPlayerData SetPlayers(...)
{
....
SetPlayerData data = new SetPlayerData(true);
....
return data;
}