(首先,抱歉我的英语不好)
我正在尝试制作扑克牌游戏。
如下代码。这些函数洗牌,
看起来是通过引用调用,但最后还是不行。
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;
}
但是如果我这样写,它就会起作用:
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;
}
}
这是怎么回事?? 谢谢!
最佳答案
您应该在参数类型前面添加 ref
关键字:
private void swapTwoCards(ref PokerCardItem cardA, ref PokerCardItem cardB)
{
PokerCardItem temp = cardA;
cardA = cardB;
cardB = temp;
}
如果您不这样做,那么当您调用以下方法时,您只需传递相应引用的副本:
swapTwoCards(cardArray[i], cardArray[random.Next() % cardArray.Length]);
您只能对您传递的对象的属性进行操作。您无法更改 cardA
指向或 cardB
指向的引用。
只要包含 ref
关键字,您就可以实现您想要的效果。
此外,您必须按如下方式进行上述调用:
swapTwoCards(ref cardArray[i], ref cardArray[random.Next() % cardArray.Length]);
现在,您可以通过引用传递值,并且可以更改实际的引用,这就是您在方法主体中实际执行的操作。
如需进一步阅读,请查看here .
关于c# - 交换时,通过引用调用在 C# 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42039600/