交换时按引用调用在 C# 中不起作用

OOD*_*all 2 c# swap reference

(首先,对不起我的英语不好)

我正在尝试制作扑克牌游戏。
正如下面的代码。那些函数洗牌,
似乎是通过引用调用,但最终它不起作用。

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)

到底是怎么回事 ??谢谢!

Chr*_*tos 5

您应该在参数类型前面加上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)

现在您通过引用传递,您可以更改实际引用,这就是您在方法主体中实际执行的操作。

如需进一步阅读,请查看此处