Почему C # не удаляет слушателей из делегата Action? - PullRequest
0 голосов
/ 19 декабря 2018

Итак, я создал очень простой менеджер событий для игры в Unity и сохраняю ссылки на Действия в словаре, например, так:

public void SubscribeToAction(string actionKey, Action<object> listener)
{
    Action<object> action;
    if(actionList.TryGetValue(actionKey, out action)){
        action += listener;
    }else{
        action += listener;
        actionList.Add(actionKey, action);
    }
}

Но что происходит, даже если я отписываюськогда я покидаю сцену, я обнаруживаю, что звонки выполняются старым слушателям, и я получаю нулевое исключение:

public void UnSubscribe(string actionKey, Action<object> listener)
{
    Action<object> action;
    if(actionList.TryGetValue(actionKey, out action)){
        action -= listener;
    }
}

Единственное решение, которое я нашел, это очистить весь словарь при выходе изсцена и добавление подписок снова в методах start ().

1 Ответ

0 голосов
/ 19 декабря 2018

action += listener; и action -= listener; просто меняют локальную переменную action.Они не меняют значение в словаре.Если вы хотите изменить значение в словаре, вам нужно будет установить значение в этом словаре , в вашем случае, значение action.

...