Поле «действия» получает значение без присвоения

#c# #json #unity3d

#c# #json #unity3d

Вопрос:

У меня есть 2 класса: ActionsFromQuestsController, ActionsComposer

ActionsFromQuestsController генерирует данные типа Action и сохраняет их в поле actions

ActionsComposer имеет actionsState, поля actions

actionsState получает новые значения из ActionsFromQuestsController и проверяет, отличается ли оно от поля actions

если true, заполняет действия новыми значениями, если нет, получает значение actions, чтобы предотвратить перегрузку

 private void Update() {
    actionsState.AddRange(actionsFromQuestsController.Actions);

    if (actionsState.Except(actions).Any()) {
      Debug.Log("Composing actions");
      ComposeActions();
    } else {
      actionsState = actions;
    }
      
    Debug.Log(actionsState.Count);
    Debug.Log(actions.Count);
  }

  private void ComposeActions() {
    actions.AddRange(actionsFromQuestsController.Actions);
      
    WriteActionsToConfig(actions);
  }
 

Но каким-то образом мое поле действий получает последние действия без вычисления метода ComposeActions. И в коде нет других назначений

Все поля имеют тип List<Действие>

Комментарии:

1. Мне показалось, что вопрос нуждается в некоторых разъяснениях относительно классовых отношений и структуры.

Ответ №1:

Хотя вы не отобразили код для ActionsComposer конструктора, я подозреваю, что actions он инициализируется аналогичным кодом, например:

 private List<Action> actions;
private ActionsFromQuestsController actionsFromQuestsController;

public ActionsComposer(ActionsFromQuestsController actionsFromQuestsController)
{
    this.actionsFromQuestsController = actionsFromQuestsController;
    this.actions = actionsFromQuestsController.Actions;
}
 

Инициализируя actions непосредственно из actionsFromQuestsController.Actions , вы фактически устанавливаете ссылку на actionsFromQuestsController.Actions , которая будет отражать любые изменения друг List в друге.

Это можно решить путем инициализации actions с помощью нового экземпляра List , например:

 private List<Action> actions;
private ActionsFromQuestsController actionsFromQuestsController;

public ActionsComposer(ActionsFromQuestsController actionsFromQuestsController)
{
    this.actionsFromQuestsController = actionsFromQuestsController;
    this.actions = new List<Action>(actionsFromQuestsController.Actions);
}
 

При этом будут получены начальные значения, actionsFromQuestsController.Actions но они больше не являются ссылкой друг на друга.

Комментарии:

1. Да, инициализация действительно сработала. Я подозревал, что проблема была связана с чем-то подобным. Но не был уверен. Большое спасибо!!!