(首先,对不起我的英语不好)
我正在尝试制作扑克牌游戏。
正如下面的代码。那些函数洗牌,
似乎是通过引用调用,但最终它不起作用。
private void disorderCards(PokerCardItem[] cardArray)
{
Random random = new Random();
for ( int t = 0; t < 10; t ++ )
for ( int i = 0; i < cardArray.Length; i ++ )
swapTwoCards(cardArray[i], cardArray[random.Next() % cardArray.Length]);
}
private void swapTwoCards(PokerCardItem cardA , PokerCardItem cardB)
{
PokerCardItem temp = cardA;
cardA = cardB;
cardB = temp;
}
Run Code Online (Sandbox Code Playgroud)
但是如果我这样写,它就会起作用:
private void disorderCards(PokerCardItem[] cardArray)
{
Random random = new Random();
for ( int i = 0; i < cardArray.Length; i ++ )
{
int n = random.Next() % cardArray.Length;
PokerCardItem temp = cardArray[i];
cardArray[i] = cardArray[n];
cardArray[n] = temp;
}
}
Run Code Online (Sandbox Code Playgroud)
到底是怎么回事 ??谢谢!
您应该在参数类型前面加上ref关键字:
private void swapTwoCards(ref PokerCardItem cardA, ref PokerCardItem cardB)
{
PokerCardItem temp = cardA;
cardA = cardB;
cardB = temp;
}
Run Code Online (Sandbox Code Playgroud)
如果您不这样做,则在调用以下方法时,只需传递相应引用的副本:
swapTwoCards(cardArray[i], cardArray[random.Next() % cardArray.Length]);
Run Code Online (Sandbox Code Playgroud)
您只能对传递的对象的属性进行操作。您无法更改cardA指向或cardB指向的引用。
而你包含ref关键字,你可以实现你想要的。
此外,您必须按以下方式进行上述调用:
swapTwoCards(ref cardArray[i], ref cardArray[random.Next() % cardArray.Length]);
Run Code Online (Sandbox Code Playgroud)
现在您通过引用传递值,您可以更改实际引用,这就是您在方法主体中实际执行的操作。
如需进一步阅读,请查看此处。