2011-01-29 5 views
0

に追加され、私はこのように見えるいくつかのコードを持っています私はoldGamePadState.Add(...);を呼び出したことはありませんが、gamePadState.Add(...);という名前を付けました。、要素が、別の辞書(C#の+ XNA)

答えて

2

私はあなただけ実際一つの辞書を持っている、とあなたは

Control.oldGamePadState = Control.gamePadState; 

(またはその逆)をやっているいくつかのコードのどこかを持っている疑いがあります。別の変数からの辞書オブジェクトをコピーしません

- それはコピー参照ので、その文の後に、彼らは両方とも同じ辞書を参照することと思います。それがあなたにとって驚きなら、私のarticle on reference types and value typesを読んでください。

Philが言っているように、それらを非公開にすることを検討すべきです。また、変数を読み取り専用にすることをお勧めします。それは辞書を読み取り専用にしません。つまり、変数が再割り当てされないようにします。

+0

これに該当するかどうかを確認するには、 '.Add()'行にブレークポイントを置き、Object.ReferenceEquals()を評価します(http://msdn.microsoft.com/en-us/library/system.object .referenceequals.aspx)を使用して、2つの辞書参照が同じかどうかを確認します。 – Bevan

4

他の場所でコードを辞書に追加する可能性は非常に高いです。彼らはどちらも公開されていることがわかります。おそらく、それらを非公開にして、ラッパーメソッドを通して辞書メソッドを公開するだけでよいでしょう。次に、これらのラッパーメソッドにブレークポイントを設定して、他のコードが辞書にアクセスしているかどうかを調べることができます。例えば

それはパブリックプロパティではなく、プレーン古いパブリック変数より(getterとsetter)を使用することが一般的に良いアイデアだ理由の詳細については
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; 
    } 
} 

this stackoverflow answerを参照してください。