2017年4月4日 星期二

C# 的 event, delegate, System.Delegate 解析

C# 寫了一段時間, 但幾乎只用過 delegate, 對 event, delegate 之間的關係一直很模糊, 甚至 System.Delegate 類別也不知道是做甚麼用的, 故先在這裡記錄一下

delegate

public delegate void MyDelegate();
MyDelegate d = () => { };
d(); 

上面這段 code 宣告了一個名為 MyDelegate 的型別, 所以可以用 MyDelegate 來 create 變數 d, 並且可以用 () 運算子直接呼叫, 概念上跟 C/C++ 的函式指標很類似


event

public delegate void EventHandler(object sender, My_EventArgs args);
public event EventHandler Click;

event 是用來修飾 delegate 欄位的修飾詞, 被 event 修飾過的 delegate 欄位, 本質上還是 delegate, 但實際上 compiler 會幫你把這個欄位加料, 變成類似屬性的用法, 讓 User 使用這個欄位時多了一些限制, 例如 event 欄位不能用 = 賦值, 只能用 +=, -= 去註冊或註銷你要掛上去的 event handler


System.Delegate


所有的 delegate 類別都會繼承這個類別, 它定義了一些 delegate 都會用到的功能, 例如 Combine 和 Remove, 但我們不該, 也應該沒有機會直接使用他, 通常是 compiler 會用到

沒有留言:

張貼留言