我有一些看起来像这样的代码:
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(...);
答案 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。
正如菲尔所说,你应该考虑把它们变成私有的 - 而且我也建议你把变量做成只读。这不会使词典只读 - 它只会阻止重新分配变量。