猿问

使 lambda 事件订阅者仅触发一次然后将其删除

我的想法是,我想用函数调用的当前变量状态生成一个闭包,并订阅一个事件。引发事件后,然后删除闭包。这意味着它只是一次性订阅者,并且可以随时取消。


另外,我希望订阅者始终订阅该事件并且不会被删除,知道如何实现这一点吗?或者还有其他方法可以实现这一目标吗?谢谢!


public class A

{

    public event Action process;


    // publisher.

    void OnEventRaise()

    {

        process?.Invoke();

    }

}


public class B

{

    // subscribe the closure and delete it once it is invoked, can unsubscribe at anytime.

    void subscribe(A a)

    {

        string name = "one shot subscriber";

        Action showName = () =>

        {

            print(name);

        }

        a.process += showName;

    }

}


public class C

{

    // this is always subscribed to the event.

    void EventCallBack()

    {

        print("always subscribed");

    }


    void subscribe(A a)

    {

        a.process += EventCallBack;

    }

}


弑天下
浏览 105回答 1
1回答

汪汪一只猫

您当前的代码存在几个问题:OnEventRaise当您应该使用事件本身时,您正在订阅该事件(即)process。使用 lambda初始化操作的语法showName不正确。你需要使用Action showName = () => { // ... };.a.process -+ showName;最后,要取消订阅该事件,您可以简单地在操作主体内部使用,但您需要先对其进行初始化以防止编译器抱怨。在你的班级尝试这样的事情B:public class B{    // subscribe the closure and delete it once it is invoked, can unsubscribe at anytime.    void subscribe(A a)    {        string name = "one shot subscriber";        Action showName = null;        showName = () =>        {            print(name);            a.process -= showName;        };        a.process += showName;    }    private void print(string s)    {        // ....    }}
随时随地看视频慕课网APP
我要回答