Когда я добавляю элементы в словарь, элементы также добавляются в другой словарь (C # + XNA) - PullRequest
0 голосов
/ 29 января 2011

У меня есть некоторый код, который выглядит следующим образом:

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 ]

4 голосов
/ 29 января 2011

Скорее всего, у вас есть код, добавляющий элементы в словари. Я вижу, что они оба публичны. Возможно, было бы хорошо сделать их приватными и открывать методы словаря только через методы-оболочки. Затем вы можете установить точку останова в этих методах-обертках, чтобы узнать, какой другой код обращается к вашим словарям.

Например:

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

Подробнее о том, почему обычно лучше использовать общедоступные свойства (методы получения и установки), а не обычные открытые переменные, см. этот ответ stackoverflow .

2 голосов
/ 29 января 2011

Я подозреваю, что у вас только на самом деле есть один словарь, и у вас где-то есть код, который выполняет

Control.oldGamePadState = Control.gamePadState;

(или наоборот).

Это не копирует словарь объект из одной переменной в другую - он копирует ссылку , поэтому после этого утверждения они оба будут ссылаться на один и тот же словарь.Если вас это удивляет, прочитайте мою статью о ссылочных типах и типах значений .

Как сказал Фил, вам следует подумать о том, чтобы сделать их приватными - и я бы также предложил вам сделать переменныенеизменяемые.Это не сделает словари доступными только для чтения - это просто предотвратит переназначение переменных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...