#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. Да, инициализация действительно сработала. Я подозревал, что проблема была связана с чем-то подобным. Но не был уверен. Большое спасибо!!!