🧠 首先,什么是委托(Delegate)?

对于委托的通俗理解

你可以把 委托(Delegate) 想象成一个“能装方法的变量”。它有点像遥控器,按下按钮(调用),就能执行某个动作(对应的方法)。


🔍 看看代码:

1
2
3
4
5
var fooDelegate = new FooDelegate(FooImp1);
fooDelegate += FooImp2;

// 委托如果 -= 里面没有任何函数就会为空
fooDelegate?.Invoke();

📌 分行解释:

第1行:

1
var fooDelegate = new FooDelegate(FooImp1);
  • 创建了一个名为 fooDelegate 的委托实例。
  • 这个委托指向了方法 FooImp1
  • 就像是在遥控器上绑定第一个按钮:按下就执行 FooImp1 方法。

第2行:

1
fooDelegate += FooImp2;
  • 把另一个方法 FooImp2 也加到这个委托里。
  • 这时候 fooDelegate 可以同时调用两个方法:FooImp1FooImp2
  • 就像是遥控器又绑定了第二个按钮,现在按一下能触发两个功能。

注意:这种可以添加多个方法的委托,叫做 多播委托(Multicast Delegate)

第3行是注释:

1
// 委托如果 -= 里面没有任何函数就会为空
  • 这句话的意思是:如果你从委托中移除一个方法(用 -=),而这个委托里已经没有方法了,那它就变成 null
  • 比如:
    1
    2
    fooDelegate -= FooImp1;
    fooDelegate -= FooImp2;
    此时 fooDelegate 就会是 null

第4行:

1
fooDelegate?.Invoke();
  • 这是在调用委托里的所有方法。
  • ?. 是一种安全调用方式,意思是:“如果 fooDelegate 不是 null,才去调用 Invoke()。”
  • Invoke() 表示“执行这个委托里的所有方法”。

✅ 所以这行代码的意思就是:“如果还有方法要执行,就全部执行一遍。”


🎯 总结一下:

代码 含义
new FooDelegate(FooImp1) 创建一个委托,指向 FooImp1 方法
+= FooImp2 再加上 FooImp2 方法一起执行
-= 可以移除方法,如果都移除了,委托就变空(null)
fooDelegate?.Invoke() 如果委托不为空,就执行里面的所有方法

🧑‍🏫 类比生活

想象你有一个闹钟(委托),你可以设置它每天早上叫你起床(调用方法)。你可以设置:

  • 7点叫你起床(FooImp1)
  • 7点放音乐(FooImp2)

那么调用 fooDelegate.Invoke() 就相当于到了7点,闹钟响了,两个动作同时发生:起床 + 放音乐。