当我向字典添加元素时,元素也被添加到另一个字典(C#+ XNA)

时间:2011-01-29 07:10:13

标签: c# dictionary xna

我有一些看起来像这样的代码:

public static class Control
{
    public static Dictionary<PlayerIndex, GamePadState> gamePadState = new Dictionary<PlayerIndex,GamePadState>();
    public static Dictionary<PlayerIndex, GamePadState> oldGamePadState = new Dictionary<PlayerIndex, GamePadState>();

    public static void UpdateControlls()
    {
        gamePadState.Clear();
        foreach (PlayerIndex pIndex in pIndexArray)
        { gamePadState.Add(pIndex,GamePad.GetState(pIndex)); }
    }
}

当我查看Debug中的代码时,当我调用gamePadState.Add(...);时,它也添加到oldGamePadState,即使我从未调用过oldGamePadState.Add(...);

2 个答案:

答案 0 :(得分:4)

您可以在其他位置添加项目到您的词典,这是非常好的。我看到他们都是公开的。也许最好将它们设为私有,并且只通过包装器方法公开字典方法。然后,您可以在这些包装器方法中设置断点,以找出其他代码正在访问您的词典。

例如:

public static class Control
{
    //Change these to private
    private static Dictionary<PlayerIndex, GamePadState> gamePadState = new Dictionary<PlayerIndex,GamePadState>();
    private static Dictionary<PlayerIndex, GamePadState> oldGamePadState = new Dictionary<PlayerIndex, GamePadState>();

    public void AddOld(PlayerIndex index, GamePadState state)
    {
        oldGamePadState[index] = state;  // Set breakpoint here
        // When the breakpoint trips, look at the stack trace to find out
        // who is calling this method
    }

    public void AddNew(PlayerIndex index, GamePadState state)
    {
        gamePadState[index] = state;
    }
}

有关为什么使用公共属性(getter和setter)而不是普通的公共变量通常是个好主意的详细信息,请参阅this stackoverflow answer

答案 1 :(得分:2)

我怀疑你只是实际上得到了一本字典,并且你已经在某处做了一些代码

Control.oldGamePadState = Control.gamePadState;

(反之亦然)。

这不会将字典 object 从一个变量复制到另一个变量 - 它会复制引用,因此在该语句之后它们都指向同一个字典。如果您感到意外,请阅读我的article on reference types and value types

正如菲尔所说,你应该考虑把它们变成私有的 - 而且我也建议你把变量做成只读。这不会使词典只读 - 它只会阻止重新分配变量。