大家应该都是知道,C#的委托+=和-=都是根据函数的签名来识别的,但是如果符号的右边是一个兰姆达表示式(例如:delegate0+=()=>{}),这个时候怎么判断右边的函数是不是同一个呢?
写个例子来测试一下,如下图,运行两次Test方法,传递的参数都是一样的兰姆达表达式,通过action委托的-=并没有将看起来一样的兰姆达表达式函数去除,为什么呢?(当然如果是传递两个确切的函数名就会最终只打印一行“hello world”,读者可自行测试),
我们来断点调试一下:可以看出运行了两次Test方法虽然传递的参数一样,但是Test方法内部获得的函数名(红框)却不一样,也就是说在程序运行时,编译器会根据一定的规则给兰姆达表达式赋予一个签名,<.ctor>表示兰姆达表达式所属的函数名,也就是声明在哪个函数内,后面的b_2-0应该就是一些起名规则,同时,可以发现声明在同一个函数内部的两个(可以延伸到多个)一样的兰姆达表达式,程序在运行时会赋予不同的签名,所以通过委托的-=时并没有起作用,最终执行了两次“hello world”。
为了测试更全面,我们将同样的兰姆达表达式在函数内只申明一次测试一下。
我们让Wraper方法运行两遍,兰姆达方法写在Wraper方法内部,执行的效果是只打印一次“hello world”,也就是说action的委托-=起作用了,识别了传递进来的参数是同一个签名,我们再打一次断点看一下。
断点详情:
可以看出,两次断点得到的函数名字是一样的,也就是说委托的-=会根据第二次传递进来的参数将第一次保留的函数去除,所以最终只执行了一次“hello world”。完毕。
可能理解有误或者剖析尚浅,如有大神了解的更多,烦请指导!谢谢。
原文地址:https://www.cnblogs.com/stigerzergold/p/9882321.html