【问题标题】:Parameter changes original value参数改变原始值
【发布时间】:2015-07-02 11:39:51
【问题描述】:

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

这是我的方法

 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 });
            }

问题是当我检查我的“If”时,我进入了第一个方法“RoyalFlushJokerHelper”,然后我从刷新列表中删除了我的所有 5 个项目。

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

我没有通过引用传递它,那么为什么第一种方法会更改我的原始列表?

【问题讨论】:

  • 是什么让你相信你没有通过参考传递它?

标签: c# list reference


【解决方案1】:

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

  • 数值数据类型
  • 布尔值、字符和日期
  • structs
  • enums
  • Lo​​ng、Byte、UShort、UInteger 或 ULong

所有其他对象都是引用类型,当您将它们传递给函数时,您将其作为引用传递
如果你想改变你的List而不影响它,你可以先克隆它:

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

请阅读有关值类型和引用类型的一些信息。
例如,看看MSDN article "Value Types and Reference Types"

【讨论】:

  • 类对象的引用类型不正确,因为前置类型也仅从该类型派生。 .net 中所有类型的父级
  • @PranayRana 我不是说objects。我的意思是class objects - 是类的对象。可能,我命名错了。无论如何,我已经确定了一个答案。如果您不介意,请查看它,如果有问题请告诉我。
猜你喜欢
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 2021-10-12
  • 1970-01-01
  • 2015-03-15
  • 2016-01-13
  • 2012-05-17
  • 2012-10-27
相关资源
最近更新 更多