亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使 lambda 事件訂閱者僅觸發一次然后將其刪除

使 lambda 事件訂閱者僅觸發一次然后將其刪除

C#
弒天下 2023-07-22 16:19:54
我的想法是,我想用函數調用的當前變量狀態生成一個閉包,并訂閱一個事件。引發事件后,然后刪除閉包。這意味著它只是一次性訂閱者,并且可以隨時取消。另外,我希望訂閱者始終訂閱該事件并且不會被刪除,知道如何實現這一點嗎?或者還有其他方法可以實現這一目標嗎?謝謝!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;    }}
查看完整描述

1 回答

?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

您當前的代碼存在幾個問題:

  • 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)

    {

        // ....

    }

}


查看完整回答
反對 回復 2023-07-22
  • 1 回答
  • 0 關注
  • 138 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號