委托与事件底层原理
00:00
C#委托与事件底层原理详解。
1. 委托本质
delegate int MyDelegate(string s);
编译为继承 System.MulticastDelegate 的类:
class MyDelegate : MulticastDelegate {
public extern int Invoke(string s);
public extern IAsyncResult BeginInvoke(string s, AsyncCallback cb, object state);
public extern int EndInvoke(IAsyncResult result);
}
2. 多播委托
MyDelegate d1 = s => s.Length;
MyDelegate d2 = s => int.Parse(s);
MyDelegate combined = d1 + d2; // InvocationList 包含两个委托
3. 事件本质
public event EventHandler<string> OnMessage;
编译为:
private EventHandler<string> _onMessage;
public event EventHandler<string> OnMessage {
add => Delegate.Combine(ref _onMessage, value);
remove => Delegate.Remove(ref _onMessage, value);
}
4. 委托 vs 事件
| 特性 | 委托 | 事件 |
|---|---|---|
| 外部调用 | 可以 | 不可以 |
| 外部赋值 | 可以 | 不可以 |
| += / -= | 可以 | 可以 |
| 封装性 | 弱 | 强 |