对于委托的理解
🧠 首先,什么是委托(Delegate)?
对于委托的通俗理解
你可以把 委托(Delegate) 想象成一个“能装方法的变量”。它有点像遥控器,按下按钮(调用),就能执行某个动作(对应的方法)。
🔍 看看代码:
1 | var fooDelegate = new FooDelegate(FooImp1); |
📌 分行解释:
第1行:
1 | var fooDelegate = new FooDelegate(FooImp1); |
- 创建了一个名为
fooDelegate
的委托实例。 - 这个委托指向了方法
FooImp1
。 - 就像是在遥控器上绑定第一个按钮:按下就执行
FooImp1
方法。
第2行:
1 | fooDelegate += FooImp2; |
- 把另一个方法
FooImp2
也加到这个委托里。 - 这时候
fooDelegate
可以同时调用两个方法:FooImp1
和FooImp2
。 - 就像是遥控器又绑定了第二个按钮,现在按一下能触发两个功能。
注意:这种可以添加多个方法的委托,叫做 多播委托(Multicast Delegate)
第3行是注释:
1 | // 委托如果 -= 里面没有任何函数就会为空 |
- 这句话的意思是:如果你从委托中移除一个方法(用
-=
),而这个委托里已经没有方法了,那它就变成null
。 - 比如:此时
1
2fooDelegate -= 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点,闹钟响了,两个动作同时发生:起床 + 放音乐。
评论