c# - 交换时,通过引用调用在 C# 中不起作用

标签 c# reference swap

(首先,抱歉我的英语不好)

我正在尝试制作扑克牌游戏。
如下代码。这些函数洗牌,
看起来是通过引用调用,但最后还是不行。

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/

相关文章:

c# - 从不同长度的字符串中获取特定长度的字符串

perl - 如何反转数组引用并将其存储在 Perl 中的另一个数组引用中?

node.js - Nodejs 进程是否可以使用比可用物理内存更多的内存(通过使用交换内存)?

c++ - 切换 QDeclarativeView 的源

python - 交换功能输出与预期不同

c# - 如何展平对象的 2 层列表并汇总其他属性常见的属性

c# - 打开特定的word文档。取决于用户选择c#

c# - 如何使用 EPPlus 向现有 Excel 文件添加新工作表?

c++ - 引用静态数据成员

JavaScript 反射(reflect)所有对象引用中的属性更改