注意:当调用Remove时,会遍历(倒序)第一个参数中的中的调用列表(_invocationList), 找到与第二个参数的_target和_methodPtr字段相匹配的委托,并将其从委托列表中移除。
当有多个匹配的情况是,Remove方法只移除第一个匹配的委托;但是,可以通过RemoeAll方法来移除所有匹配的委托。
同样对委托移除的方法Delegate.Remove(Delegate A, Delegate B),可以进行下面的概括:
如果A为null,返回null。
如果B为null,返回A。
如果A的_invocationList为null,即不包含委托链,那么如果A本身与B匹配,则返回null,否则返回A。
如果A的_invocationList中不包含与B匹配的委托,则返回A。
如果A的_invocationList中包含与B匹配的委托,则从链表中移除B,然后
如果A的链表中只剩下一个委托,则返回该委托。
如果A的链表中还剩下多个委托,将重新构建一个新的委托,并且新的委托的_invocationList为A的_invocationList移除了B之后的List。
总结通过这篇文章,进一步认识了委托类型,然后通过一个例子观察了委托链的建立以及调用列表的变化。
通过这两篇文章,对委托应该有了一定的认识:
通过delegate关键字声明委托类型
[<修饰符>] delegate <返回类型> <委托名> ([<形参表>])
找到与委托签名相符的方法来创建委托实例,也可以通过"+="和"-="来组合和移除委托
new <委托类型名> (<方法>)
通过委托实例调用委托