[Event]委派 & 事件 (範例)

[Event]委派 & 事件 (範例)

環境:.NET 2.0

內容:下載點

1. 只會Run最後註冊的事件: BaseSingleDelegatePage.cs , /Single

2. Run所有註冊的事件: BaseSingleDelegatePage.cs , /Multi

3. 只用委派也行: DelegateOnly

4. 事件 & 委派的差別

 

我原本以為只要註冊(+=)處理函式, 程式就會依序執行, 今天一測, 完全不是那麼一回事,

以下這種標準程式碼, 只會Run最後註冊的事件

    public event Echo EchoHandler;

    public void Page_Load(object sender, EventArgs e)
    {   
        if (EchoHandler != null)
        {
            Response.Output.WriteLine(EchoHandler(sender, e) + "<br />");
        }
    }

必須用下面這種才會依序執行

    public event Echo EchoHandler;

    public void Page_Load(object sender, EventArgs e)
    {
        if (EchoHandler != null)
        {
            object[] param = new object[] { sender, e };
            foreach (Delegate dlgt in EchoHandler.GetInvocationList())
            {

                Response.Output.WriteLine(dlgt.DynamicInvoke(param) + "<br/>");
            }
        }
    }

然後我一直在想加 event 到底是為什麼?

推論應該是可以用 add(+=) remove(-=) 來堆疊處理函式,

結果, 被打了一巴掌, 在同一個樹系(子類別), 就算不用 event 修飾詞, 亦可用+=及-=.

 

最後只好求助G大神, 剛好在對岸找到答案,

(1) 若沒用Event, 你無法在外部的類別直接去使用+=及-=語法,

        // 錯誤	2	無法將型別 'BaseSingleDelegatePage.Echo' 隱含轉換為 'BaseDelegatePage.Echo'
        d.EchoHandler += new BaseSingleDelegatePage.Echo(d_EchoHandler);        

若是宣告為public, 可以直接引用它,

 

(2) 反之, 若有宣告為 event, 你可以用+=及-=語法, 但不能直接引用它

        d.EchoHandler();