1

私はプレーヤーがポーカーをするプログラムのコードを書いています。私の質問は、リストでの参照と値の受け渡しに関するものです。

私のプログラムには、Playerオブジェクト、Dealerオブジェクト、およびPokerTableオブジェクトがあります。PokerTableには2つのプレーヤーのリストがあります。1つはプレーヤーと呼ばれ、もう1つは勝者と呼ばれます。プレーヤーのリストは、DealerオブジェクトのDetermineWinnerメソッドに渡されます。このメソッドは、勝者(または同点の場合は勝者)のリストを返します。次に、PokerTableは勝者のリストを使用して、誰にお金を支払うかを決定します。

    class PokerTable
    {
        private Dealer dealer;
        private List<Player> players;
        private List<Player> winners;            

        private void EndHand()
        {
            winners = dealer.DetermineWinner(players);
            PayPlayers();
            winners.Clear();
            PrepareForNextHand();
        }

        private void PayPlayers()
        {
           /* code here uses the winners list to determine
            * how much to pay each winner and adds that money
            * to the player object */
        }

私の質問は、勝者リストのプレーヤーオブジェクトにお金を追加すると、元のプレーヤーリストの元のプレーヤーオブジェクトにも影響するかどうかです。

4

1 に答える 1

3

List<Player>Playerオブジェクトへの参照のリストです。

2 つの別々のリスト内の参照が同じものを指している場合、一方のリスト内Playerの を更新するPlayerと、もう一方のリスト内の参照も変更されたように見えPlayerます。

class Player
{
     internal int Money;
}

// ...

    Player player = new Player{ Money = 700 };
    List<Player> list1 = new List<Player>{player};
    List<Player> list2 = new List<Player>{player};

    list1[0].Money = 400;

    Assert.AreEqual(400, list2[0].Money); // Assertion passes.

一方、リストが値の型を指している場合、もちろん変更は反映されません。

var money = 700;
var list1 = new List<int>{money};
var list2 = new List<int>{money};

list1[0] = 400;

Assert.AreNotEqual(400, list2[0]); // Assertion passes.
于 2012-07-30T17:34:26.117 に答える