(首先,抱歉我的英语不好)
我正在尝试制作扑克牌游戏
如下面的代码那样。这些功能改组了套牌,
似乎是通过引用来调用,但最后它不起作用。
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;
}
}
发生什么事了? 谢谢!
答案 0 :(得分:4)
您应该使用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。
答案 1 :(得分:0)
导致在方法参数中,您不会仅仅通过参考值传递参考值,因此如果在方法中更改了值,则您的实际参考值不会受到影响。你可以使用ref / out参数。
答案 2 :(得分:0)
默认情况下,C#中的参数按值传递。 &#34;值&#34;对于引用类型是引用,一个透明的&#34;指针&#34;用于定位实际数据。在 swapTwoCards 中,您只是在参数中交换指针,它对方法的外部没有影响。您想要交换两个变量的内容,为此有ref
关键字:
private void swapTwoCards(ref PokerCardItem cardA, ref PokerCardItem cardB)
{
PokerCardItem temp = cardA;
cardA = cardB;
cardB = temp;
}
以这种方式装饰,参数通过引用传递包含值的实际变量,因此赋值修改原始变量。使用方式如下:
swapTwoCards(ref cardArray[i], ref cardArray[random.Next() % cardArray.Length]);
如果您在确定是否将ref
放入参数时遇到麻烦,请尝试将参数类型设想为int
或其他基本类型。请记住默认情况下参数是按值的,因此您只需切换方法内的值。引用类型和by-ref参数传递没有任何共同之处(当然,除了&#34;引用&#34;之外)。
答案 3 :(得分:-1)
您可能听说默认情况下通过引用传递对象,这是真的。但是,您不需要通过引用传递;您需要传递对引用的引用,因为swapTwoCards
的点不是更新对象而是更新对象的引用。
要通过引用传递对象引用,请使用ref
关键字。
private void swapTwoCards(ref PokerCardItem cardA, ref PokerCardItem cardB)
{