C#的兰姆达表达式与委托配合使用时的一些问题

2021-07-03 19:07

阅读:435

标签:运行   断点   分享   了解   color   就是   全面   col   函数名   

大家应该都是知道,C#的委托+=和-=都是根据函数的签名来识别的,但是如果符号的右边是一个兰姆达表示式(例如:delegate0+=()=>{}),这个时候怎么判断右边的函数是不是同一个呢?

写个例子来测试一下,如下图,运行两次Test方法,传递的参数都是一样的兰姆达表达式,通过action委托的-=并没有将看起来一样的兰姆达表达式函数去除,为什么呢?(当然如果是传递两个确切的函数名就会最终只打印一行“hello world”,读者可自行测试),

技术分享图片

我们来断点调试一下:可以看出运行了两次Test方法虽然传递的参数一样,但是Test方法内部获得的函数名(红框)却不一样,也就是说在程序运行时,编译器会根据一定的规则给兰姆达表达式赋予一个签名,<.ctor>表示兰姆达表达式所属的函数名,也就是声明在哪个函数内,后面的b_2-0应该就是一些起名规则,同时,可以发现声明在同一个函数内部的两个(可以延伸到多个)一样的兰姆达表达式,程序在运行时会赋予不同的签名,所以通过委托的-=时并没有起作用,最终执行了两次“hello world”。

技术分享图片技术分享图片

 为了测试更全面,我们将同样的兰姆达表达式在函数内只申明一次测试一下。

我们让Wraper方法运行两遍,兰姆达方法写在Wraper方法内部,执行的效果是只打印一次“hello world”,也就是说action的委托-=起作用了,识别了传递进来的参数是同一个签名,我们再打一次断点看一下。

 

技术分享图片

断点详情:

技术分享图片

技术分享图片

 

 可以看出,两次断点得到的函数名字是一样的,也就是说委托的-=会根据第二次传递进来的参数将第一次保留的函数去除,所以最终只执行了一次“hello world”。完毕。

可能理解有误或者剖析尚浅,如有大神了解的更多,烦请指导!谢谢。

C#的兰姆达表达式与委托配合使用时的一些问题

标签:运行   断点   分享   了解   color   就是   全面   col   函数名   

原文地址:https://www.cnblogs.com/stigerzergold/p/9882321.html


评论


亲,登录后才可以留言!