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

大家应该都是知道,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

时间: 2024-11-05 15:53:30

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

兰姆达表达式Lambda 表达式(C# 编程指南)

转https://msdn.microsoft.com/zh-cn/library/bb397687.aspx Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数.通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数.Lambda 表达式对于编写 LINQ 查询表达式特别有用. 若要创建 Lambda 表达式,需要在 Lambda 运算符 => 左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块.例如,lambda 表达式 x => x

C#基本功------委托和事件(二)--拉姆达表达式

委托的另一种用法---------匿名方法: public delegate void MyDel(string msg);----声明的委托 class Program { static void Main(string[] args) { MyDel mdl = delegate(string str) { Console.WriteLine(str); }; mdl("床前明月光"); Console.ReadKey(); } }另一种简单的写法 public delegate

lanmda 兰姆表达式

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 兰姆表达式 { class Program { //匿名方法的写法 static void Main(string[] args) { //Func<>里面第一个写的是返回值类型,第二个往后写的是输入值的类型,等号后面必须和前面对应起来 Func<string, string, string>

C#高级------拉姆达表达式

namespace out_ref { //声明一个委托 public delegate int Add(int n1,int n2); class Program { //拉姆达表达式 static void Main(string[] args) { Add a = (n1,n2) => n1 - n2; int c = a(10, 5); Console.WriteLine(c); Console.ReadKey(); } } }

拉姆达表达式(Lambda Expressions)

上面两种写法是一样的 ,拉姆达表达式也是一种委托, 但引用的是匿名方法

表达式树,它与表达式、委托

表达式树,它与表达式.委托有什么区别? 序言 首先,需要普及下基础知识: Expression我们称之为:表达式树, 而Func<>或者Action 称之为:匿名委托,Func与Action的区别是Func带返回值(至少一个参数),Action不带返回值(可以没有任何参数). 以上的关键词是在.net 3.5之后出现的,配合Linq中Lambda使用. 当然Expression还可以动态的进行构造它,而不使用Lambda表达式来定义. 什么是表达式树 它是一种数据结构体,用于存储需要计算.运算

拉姆达表达式

m_pSprite->runAction(CCSequence::create(FadeIn::create(0.4),CallFunc::create([&]{isComplete = true;}),NULL)); 拉姆达表达式,就是一个居部函数,跟居部变量差不多的用法

尼姆达病毒分析

尼姆达病毒: 尼姆达病毒是蠕虫类病毒中具有代表性的病毒之一,它综合运用了当时流行的所有传播方式,因此传播更快,破坏性更大.尼姆达病毒有以下几种传播方式: 1. 感染文件. 最为常见的病毒传播方式.尼姆达病毒会找到本机系统中的EXE文件,并将代码置入源文件体内,从而达到对文件的感染.当用户执行这些文件的时候,就会传播病毒. 2. 乱发邮件. 利用MAPI从邮件的客户端及HTML文件中搜索邮件地址,然后将病毒发送给这些地址.这些邮件包含一个名为README.exe的附件,在某些系统中该文件能够自动执

c#Lamdba表达式与委托

介绍: "Lambda表达式"(lambda expression)是一个匿名函数,在C#3.0中引入了lambda表达式,它是对匿名函数的一种简化,可以包含表达式和语句,并且可用于创建委托或表达式目录树类型. 如何创建 格式:( 形参列表 ) => { 函数体 } 若要创建 Lambda表达式,需要在 Lambda运算符=>左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块.例如,lambda表达式 x => x * x指定名为 x的参数并返回 x的平方值.