Запрещает члену класса клонировать ссылку делегата при назначении? - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь использовать класс для упрощения динамической привязки и отмены привязки обратного вызова метода к делегату. Когда свойство Bound изменяется на другое значение, обратный вызов добавляется или удаляется из делегата actionEvent в зависимости от того, является ли привязка истинным или ложным.

public class Binding
{
    private bool bound;

    private Action actionEvent;
    private Action callback;

    //Constructor
    public Binding(ref Action actionEvent, Action callback, bool isBound = true)
    {
        this.actionEvent = actionEvent; //actionEvent is either being cloned here, or whenever it's referenced
        this.callback = callback;
        this.bound = isBound;

        if (this.bound)
        {
            Debug.Log("Binding callback to event!");
            this.actionEvent += this.callback;  //This is a reference to the plrInput class
        }
    }

    //Bound property binds and unbinds the callback function to the event when changed
    public bool Bound
    {
        get { return bound; }
        set 
        {
            if (bound != value)
            {
                bound = value;
                if (bound)
                {
                    Debug.Log("Rebinding callback!");
                    actionEvent += callback;
                    return;
                }
                actionEvent -= callback;
                Debug.Log("Unbinding callback!");
            }
        }
    }
}

Класс создается в стартовом методе следующим образом:

void Start
{
     Binding JumpBinding = new Binding(ref plrInput.OnSpacePressed, Jump); 
     // plrInput.OnSpacePressed is a delegate from another class which is invoked when I press space
     // Jump is a method which causes the player to jump
}

Я новичок в c#, и вчера я узнал о делегатах и ​​ключевом слове ref, так что, возможно, моя проблема связана с недоразумением. Проблема, с которой я сталкиваюсь, заключается в том, что член класса actionEvent в Binding - это просто клон аргумента actionEvent, переданного через конструктор, даже если я передаю его по ссылке. Мне удалось подтвердить это путем тестирования.

Когда я вызываю plrInput.OnSpacePressed, когда обратный вызов привязан к элементу класса Binding actionEvent, обратный вызов не вызывается. Есть ли у кого-нибудь объяснение того, почему у меня такое поведение, и как я могу потенциально решить эту проблему или есть ли лучший подход?

...