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

时间:2017-02-04 11:05:09

标签: 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;
        }
    }

发生什么事了? 谢谢!

4 个答案:

答案 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)
{