这是我第一次使用元组,所以我可能会做一些完全错误的事情,或者只是错过了一些小事。我以前有重复的代码:
if (!B1Fturn)
{
if (B1turn)
{
FixCall(b1Status, ref b1Call, ref b1Raise, 1);
FixCall(b1Status, ref b1Call, ref b1Raise, 2);
Rules(2, 3, "Bot 1", ref b1Type, ref b1Power, B1Fturn, b1Status);
AutoCloseMsb.Show("Bot 1 Turn", "Turns", thinkTime);
AI(2, 3, ref bot1Chips, ref B1turn, ref B1Fturn, b1Status, b1Power, b1Type);
turnCount++;
B1turn = false;
B2turn = true;
}
}
if (B1Fturn && !b1Folded)
{
bools.RemoveAt(1);
bools.Insert(1, null);
maxLeft--;
b1Folded = true;
}
if (B1Fturn || !B1turn)
{
await CheckRaise(1, 1);
B2turn = true;
}
我复制并粘贴了5次,所以我决定把它全部放在一个方法中,然后将方法粘贴5次。所以我开始这样做,但我意识到我需要等待一些方法,所以我去了async Task<some input>
但是我需要取回一些值,一些布尔值和int的.2选项返回或使用ref / out。无论如何都不允许在异步方法中使用Ref / out,因此只返回。事情是我需要返回一些不同类型的数据,所以我需要一些能做到这一点的东西(它是元组)。我使用Tuple创建了一个方法:
async Task<Tuple<bool, bool, bool>> Rotating(bool tempTurn, bool permaTurn, bool folded, string name, Label Status, int botCall, int botRaise, int start, int end, int current, bool next, double power, double type, int chips)
{
if (!permaTurn)
{
if (tempTurn)
{
FixCall(Status, ref botCall, ref botRaise, current);
FixCall(Status, ref botCall, ref botRaise, start);
Rules(start, end, name, ref type, ref power, permaTurn,Status);
AutoCloseMsb.Show(name + " Turn", "Turns", thinkTime);
AI(start, end, ref chips, ref tempTurn, ref permaTurn, Status, power, type);
turnCount++;
tempTurn = false;
next = true;
}
}
if (permaTurn && !folded)
{
bools.RemoveAt(current);
bools.Insert(current, null);
maxLeft--;
folded = true;
}
if (permaTurn || !tempTurn)
{
await CheckRaise(current, current);
next = true;
}
return new Tuple<bool, bool, bool>(tempTurn, permaTurn, next);
}
正如你所看到的那样,它表示返回bool,bool,bool以及之后需要获得的值。然而,如果我把断点放在return
线上从下一个转向为真,那么接下来没有得到它的价值会改变,但是一旦它退出该方法,它就会恢复为默认值。其他2个布尔也是如此。为什么?我怎么做错了如何解决这个问题。
答案 0 :(得分:3)
聊天后的对话编辑: 你可以等待async函数,它将返回一个元组,使用它如下:
var r = await Test (x, y); // x,y for example, Test returns Tuple
Now you can access r.Item1 and r.Item2