通过引用而不是通过值传递,为什么?

本文关键字:为什么 引用 值传 | 更新日期: 2023-09-27 18:04:01

我要做的是将我的playerlist的名称和分数转储到一个临时数组中进行排序,以便它们可以显示在记分牌上。

出于某种原因,它似乎保留了对值的引用,而不是值本身。排序后的计分板上写着"玩家4 -得分4"的每一个条目。我知道排序方法是有效的,我之前在另一个游戏中使用过它。

初始值为Player1 - 1参与人2 - 2Player3 - 3Player4 - 4

缺少的一件事是每次更新都将分数转储到分数列表中。我把它拿出来后,试图重新安排东西,使其工作。

请帮助我理解为什么会发生这种情况。我在这里读了这篇文章,但没有多大帮助。http://msdn.microsoft.com/en-us/library/0f66670z (v = vs.71) . aspx

进行初始化
  ScoresList = DumpListToArray(PlayerManager.PlayerList);

更新
SortKillScores(ScoresList);

private static void DrawKillScores(SpriteBatch spriteBatch)
    {
        for (int i = 0; i < 4; i++)
        {
            spriteBatch.DrawString(font, "" + ScoresList[i].Name + " - " + ScoresList[i].KillScore, new Vector2(900, 0 + 20 * i), Color.White, 0f, Vector2.Zero, 0.5f, SpriteEffects.None, 1f);  
        }
    }

方法
private static ScoreHolder[] DumpListToArray(List<Player> tempList)
    {
        ScoreHolder[] tempArray = new ScoreHolder[4];
        for (int i = 0; i < 4; i++)
        {
            tempArray[i] = new ScoreHolder();
            tempArray[i].Name = tempList[i].PlayerName;
            tempArray[i].KillScore = tempList[i].KillScore;
            tempArray[i].TimeScore = tempList[i].TimeScore;
            tempArray[i].PointScore = tempList[i].PointScore;
        }
        return tempArray;
    }
    private static void SortKillScores(ScoreHolder[] array)
    {
        for (int i = 0; i < array.Length; i++)
        {
            for (int k = i; k > 0 && array[k].KillScore > array[k - 1].KillScore; k--)
            {
                int score = array[k].KillScore;
                string name = array[k].Name;
                array[k] = array[k - 1];
                array[k - 1].KillScore = score;
                array[k - 1].Name = name;
            }
        }       
    }

通过引用而不是通过值传递,为什么?

与其尝试将属性从一个单元格复制到另一个单元格,不如交换单元格:

private static void SortKillScores(ScoreHolder[] array)
{
    for (int i = 0; i < array.Length; i++)
    {
        for (int k = i; k > 0 && array[k].KillScore > array[k - 1].KillScore; k--)
        {
            var temp = array[k];
            array[k] = array[k - 1];
            array[k - 1] = temp;
        }
    }       
}

您所拥有的是将同一项的引用复制到array[k],然后编辑k-1中的项,其中是相同的项!

int score = array[k].KillScore;
string name = array[k].Name;
array[k] = array[k - 1];          // cells k and k-1 are the same item!
array[k - 1].KillScore = score;   // this changes both k and k-1
array[k - 1].Name = name;         // and so does this!

@MattBurland似乎在这里涵盖了您,但是为了扩展,如果您只是试图排序,您应该尝试使用OrderBy方法。

private static ScoreHolder[] SortKillScores(ScoreHolder[] array)
{
    return array.OrderBy(e => e.KillScore);
}