首页 / 知识
关于c#:. NET Framework中的lambda和委托之间有什么区别?
2023-04-15 23:41:00

What is the difference between lambdas and delegates in the .NET Framework?我经常被问到这个问题,我想就如何最好地描述两者之间的差异征求一些意见。 它们实际上是两件事。"委托"实际上是持有对方法或lambda的引用的变量的名称,而lambda是没有永久名称的方法。 Lambda与其他方法非常相似,只是有一些细微的区别。 委托的定义如下:
只要签名是相同的,则BinaryIntOp类型的变量可以分配一个方法或labmda:两个Int32参数和一个Int32返回。 Lambda可以这样定义:
还要注意的另一件事是,尽管通常将泛型Func和Action类型视为" lambda类型",但它们与任何其他委托一样。关于它们的好处是,它们本质上为您可能需要的任何类型的委托定义了一个名称(最多4个参数,尽管您当然可以添加更多自己的委托)。因此,如果您使用各种各样的委托类型,但不止一次,则可以通过使用Func和Action避免使用委托声明使代码混乱。 这是Func和Action如何"不仅仅用于lambda"的说明:
要知道的另一件事是,具有相同签名但名称不同的委托类型(而不是方法本身)不会被隐式地强制转换为彼此。这包括Func和Action委托。但是,如果签名相同,则可以在它们之间显式转换。 更加努力。...在C#中,函数很灵活,可以使用lambda和委托。但是C#没有"一流的功能"。您可以使用分配给委托变量的函数名称来创建代表该函数的对象。但这实际上是一个编译器技巧。如果通过在函数名称后加上句点来开始语句(即尝试对函数本身进行成员访问),则会发现那里没有要引用的成员。甚至没有来自对象的。这样可以防止程序员做有用的(当然是潜在的危险)事情,例如添加可以在任何函数上调用的扩展方法。您可以做的最好的事情就是扩展Delegate类本身,这当然也很有用,但还不多。 更新:另请参阅Karg的答案,该答案说明了匿名委托与方法和lambda之间的区别。 更新2:James Hart提出了一个重要的建议,尽管非常技术性,但它指出lambda和委托不是.NET实体(即CLR没有委托或lambda的概念),而是它们是框架和语言构造。 这个问题有点模棱两可,这解释了您得到的答案之间的巨大差异。 您实际上问过.NET框架中的lambda和委托之间有什么区别;那可能是许多事情之一。您在问:
有些人似乎在试图回答" C#Lambda表达式和.NET System.Delegate之间有什么区别?"这个问题,但这没有什么意义。 .NET框架本身并不理解匿名委托,lambda表达式或闭包的概念,这些都是语言规范定义的。考虑一下C#编译器如何将匿名方法的定义转换为生成的类上带有成员变量的方法,该成员变量具有关闭状态;到.NET,委托没有任何匿名性。对于编写它的C#程序员而言,它只是匿名的。分配给委托类型的lambda表达式也是如此。 .NET可以理解的是委托的概念-一种描述方法签名的类型,该方法的实例表示对特定对象上的特定方法的绑定调用,或对特定类型上的特定方法的未绑定调用。所述方法遵循所述签名的任何类型的对象。这些类型都继承自System.Delegate。 .NET 3.5还引入了System.Linq.Expressions命名空间,该命名空间包含用于描述代码表达式的类,因此它还可以表示对特定类型或对象的方法的绑定或未绑定调用。然后,可以将LambdaExpression实例编译为实际的委托(从而对基于表达式结构的动态方法进行代码生成,并返回指向它的委托指针)。 在C#中,您可以通过为该类型的变量分配一个lambda表达式来生成System.Expressions.Expression类型的实例,这将生成适当的代码以在运行时构造该表达式。 当然,如果您要问的是Lambda表达式和C#中的匿名方法之间到底有什么区别,那么所有这些几乎都没有关系,在这种情况下,主要的区别是简洁,当您不这样做时,它倾向于匿名委托。不必在意参数,也不要计划返回值,而在要输入推断的参数和返回类型时,请不要使用lambda。 lambda表达式支持表达式生成。 一个区别是,匿名委托可以省略参数,而lambda必须与确切的签名匹配。鉴于:
您可以通过以下四种方式调用它(请注意,第二行包含一个不带任何参数的匿名委托):
您不能传入不带参数的lambda表达式或不带参数的方法。这些是不允许的:
委托等效于函数指针/方法指针/回调(请选择),而lambda则是简化了的匿名函数。至少那是我告诉人们的。 委托基本上基本上只是一个函数指针。 Lambda可以变成委托,但也可以变成LINQ表达式树。例如,
第一行产生一个委托,而第二行产生一个表达式树。 我对此没有很多经验,但是我要描述的方式是委托是任何函数的包装,而lambda表达式本身就是一个匿名函数。 很明显,这个问题的原意是" lambda和匿名代表之间有什么区别?"在这里的所有答案中,只有一个人正确无误-主要区别在于可以使用lambda以及表达式树来创建表达式树。 您可以在MSDN上阅读更多信息:http://msdn.microsoft.com/zh-cn/library/bb397687.aspx 委托是对具有特定参数列表和返回类型的方法的引用。它可能包含对象,也可能不包含对象。 Lambda表达式是匿名函数的一种形式。 委托是函数签名;就像是
委托没有实现主体。 lambda是与委托签名匹配的函数调用。对于上述代表,您可以使用以下任何一种:
但是, lambda只是委托上的语法糖。编译器最终将lambda转换为委托。 我相信这些都是一样的:
委托是函数指针的队列,调用委托可以调用多个方法。 Lambda本质上是一个匿名方法声明,编译器可能会不同地解释它,具体取决于它用作什么上下文。 您可以通过将lambda表达式转换为委托来获得指向该lambda表达式的委托,或者如果将其作为参数传递给需要特定委托类型的方法,则编译器将为您转换该委托。在LINQ语句中使用它,lambda将由编译器转换为表达式树,而不是简单的委托。 真正的区别在于,lambda是在另一个表达式内部定义方法的简洁方法,而委托是实际的对象类型。 代表实际上只是函数的结构化类型。您可以使用名义上的类型输入和实现实现接口或抽象类的匿名类来执行相同的操作,但是当只需要一个函数时,最终将产生大量代码。 Lambda来自1930年代Alonzo Church的lambda演算的思想。这是创建函数的匿名方式。它们对于组成函数特别有用 因此,尽管有人可能会说lambda是代表的语法糖,但我会说代表是在c#中使人们轻松使用lambda的桥梁。 这是我在la脚的博客上放了一段时间的示例。假设您要通过工作线程更新标签。我有4个示例,说明如何使用委托,匿名委托和2种类型的lambda将标签从1更新为50。
一些基本的。 这是一种匿名方法-
由于匿名方法没有任何名称,因此我们需要一个委托,我们可以在其中分配这些方法或表达式。对于前
与lambda表达式相同。通常我们需要委托来使用它们
我们可以使用func委托来使用此表达式。
我假设您的问题与c#有关,而不与.NET有关,因为您的问题含糊不清,因为.NET并不孤单-也就是说,没有c#-委托和lambda表达式的理解。
一个(正常的,与所谓的泛型委托相反的委托)委托应该被视为一种函数指针类型的c ++
typedef的类型为
其中 在C#中,您会去
你会这样使用它:
其中 现在,您在c#中也有泛型委托,这些泛型委托是泛型的委托,即可以说是"模板化"的,因此使用c ++表达式。它们的定义如下:
您可以像这样使用它们:
其中
现在,想象一下,我想使用一个现在尚未在任何地方定义的"函数"(而不是
道德?最后,如果不是函数指针类型(封装的+智能+泛型函数指针的类型),那么委托是什么(分别是通用委托),是吗?还有别的!看到这个和那个。 Lambda是代表的简化版本。它们具有闭包的某些属性,例如匿名委托,但是还允许您使用隐式键入。这样的lambda:
比您可以对委托执行的操作更为简洁:
好吧,真正简化的版本是lambda只是匿名函数的简写。委托不仅可以执行匿名功能,还可以做很多事情:事件,异步调用和多个方法链。 |
最新内容
相关内容
linux命令格式描述?
linux命令格式描述?,地址,图片,系统,工作,命令,信息,设备,百分比,名字,首次,linux命令的格式化命令是什么?1、Linux的磁盘格式化命令是“mkfslinux命令描述中文?
linux命令描述中文?,地址,系统,工作,信息,目录,命令,基础,工具,标准,文件,Linux命令1、linux系统常用操作命令如下:ls:全拼list,功能是列出目录的pythonHTTP与HTTPS之间的区别
pythonHTTP与HTTPS之间的区别,通信,信息,状态,证书,数据,时间,服务,灵活,培训,网络,我们都知道Python的应用场景很多,包括Web开发,也可以理解为Python类与类之间的关系是什么?
Python类与类之间的关系是什么?,代码,概念,名称,教育,科技,技术,基础,培训,关系,属性,我们都知道Python编程语言是面向对象的,在面向对象中,有类pythonCookie和Session有什么区别?
pythonCookie和Session有什么区别?,信息,地址,时间,新浪,网站,数据,百度,风险,培训,服务,一、存取方式不同cookie中只能存储ASCII字符串。如果Spyder和Python之间是什么关系?
Spyder和Python之间是什么关系?,工作,位置,环境,观察,对比,工具,状态,数据,分析,培训,想必很多人都听说过Spyder,那么你知道它和Python之间有什golang和python有什么区别?
golang和python有什么区别?,系统,代码,管理,标准,数据,网络,数字,设计,多地,人工智能,1、范例python是一种基于面向对象编程的多范式,命令式和Python之描述符
Python之描述符,数据,情况,方法,属性,首次,代码,培训,基础,分析,上调,Descriptors(描述符)是Python语言中一个深奥但很重要的一个黑魔法,它被python多线程和多进程之间的联系
python多线程和多进程之间的联系,进程,培训,通信,标准,管理,代理,线程,模块,之间,全部,关于多线程的大概讲解:在Python的标准库中给出了2个模python模块和类有什么区别
python模块和类有什么区别,数据,代码,培训,设计,名字,公用,变量,实例,方法,对象,python模块是:自我包含并且有组织的代码片段为模块。表现形式pythonCookie和Session有什么区别?
pythonCookie和Session有什么区别?,培训,python版本2和3之间的区别是什么?
python版本2和3之间的区别是什么?,培训,区别,之间,版本,