参数更改原始值

本文关键字:原始 参数 | 更新日期: 2023-09-27 18:00:52

我想这是个愚蠢的问题,但如果你能看看

这是我的方法

 public Tuple CheckRoyalFlush()
        {
            List<Honours> flush = new List<Honours>()
            {
                Honours.Ace,
                Honours.King,
                Honours.Queen,
                Honours.Jack,
                Honours.Ten
            };
            if (RoyalFlushJokerHelper(honoursOnTheScreen, flush) || ContainsAllItems(honoursOnTheScreen, flush))
            {
                Suits suit = cardsOnTheScreen.ElementAt(0).GetSuit();
                foreach (Card card in cardsOnTheScreen.Skip(1))
                {
                    if (card.GetSuit() != suit)
                    {
                        if (card.GetHonour() == Honours.Joker)
                            continue;
                        else
                            return new Tuple(false, null);
                    }
                }
                return new Tuple(true, new List<int> { 0, 1, 2, 3, 4 });
            }

问题是,当我检查我的"如果"时,我得到了第一个方法"RoyalFlushJokerHelper",在那里我从刷新列表中删除了我的所有5个项目。

然后问题是,当我进入ContainAllItems方法时,我的刷新列表是空的。

我不是通过引用来传递它,那么为什么第一个方法会更改我的原始列表呢?

参数更改原始值

在C#中,只有这些对象是值类型:

  • 数字数据类型
  • 布尔值、字符和日期
  • struct s
  • enum s
  • Long、Byte、UShort、UInteger或ULong

所有其他对象都是引用类型,当您将它们传递给函数时,您将其作为引用传递
如果你想在不影响List的情况下更改它,你可以在之前克隆它

public bool RoyalFlushJokerHelper(object honoursOnTheScreen, List<Honours> honours)
{
    var honoursCopy = honours.Clone();
    // work with honoursCopy
}

请阅读有关值类型和引用类型的一些信息
例如,看看MSDN的文章"值类型和引用类型"。