进一步理解C#委托(2)

注意:当调用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 <委托类型名> (<方法>)

通过委托实例调用委托 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/56fd050e09b21e4b3e177ff304a1293f.html