首页 > 编程语言 >五分钟重温C# 委托,匿名方法,Lambda,泛型委托,表达式树

五分钟重温C# 委托,匿名方法,Lambda,泛型委托,表达式树

时间:2023-03-01 11:11:17浏览次数:53  
标签:委托 C# CalculatorAdd int delegate 泛型 方法 表达式

五分钟重温C# 委托,匿名方法,Lambda,泛型委托,表达式树

翔星 翔星 有10年+工作经验,高级软件工程师,可以解决各种问题  

第一分钟:委托

有些教材,博客说到委托都会提到事件,虽然事件是委托的一个实例,但是为了理解起来更简单,今天只谈委托不谈事件。先上一段代码:

下边的代码,完成了一个委托应用的演示。一个委托分三个步骤:

class Program { //step01:首先用delegate定义一个委托 。 public delegate int CalculatorAdd(int x, int y); static void Main(string[] args) {//step03:用这个方法来实例化这个委托。 CalculatorAdd cAdd = new CalculatorAdd(Add); //int result = cAdd(5, 6); int result = cAdd.Invoke(5, 6); } // step02:声明一个方法来对应委托。 public static int Add(int x, int y) {returnx+y;} }

step01:首先用delegate定义一个委托 。

step02:声明一个方法来对应委托。

step03:用这个方法来实例化这个委托。

至此,一个委托的应该就完成了,就可以调用委托了。

第二分钟:匿名方法

在上一分钟已经知道了,完成一个委托应用分三步走,缺一步都不行,如果要跨大步,当心步子大了扯着蛋。

但是微软不怕扯着蛋,非要把三步做成两步来走啊!所以微软就用匿名方法来简化上边的三个步骤。

匿名方法这个玩意儿怎么说呢,在C#中完全是可有可无的东西,只是为C#锦上添花,有人别出心裁给它取个名字叫语法糖。

class Program { //step01:首先用delegate定义一个委托 。 public delegate int CalculatorAdd(int x, int y); static void Main(string[] args) { //step02:用这样的写法 delegate(int x, int y) { return x + y; },把一个方法赋值给委托 CalculatorAdd cAdd = delegate (int x, int y) { return x + y; }; int result = cAdd.Invoke(5, 6); } }

step01:首先用delegate定义一个委托 。

step02:用这样的写法 delegate(int x, int y) { return x + y; },把一个方法赋值给委托,其实这种写法就是匿名方法。

这时会惊奇的发现,这不是三步当着两步走了哇?

第三分钟:Lambda表达式

原本很简单的程序,加上几个delegate关键字,这代码一下就变得深奥了,深奥的东西懂的人就变少了,所以这个还可以作为加薪的筹码。

但是微软对C#的设计理念是简单易用。微软就想方设法来简化delegate(int x, int y) { return x + y; }这个匿名方法,Lambda就出现了。

下边我来看几种lambda表达式的写法:

class Program { public delegate int CalculatorAdd(int x, int y); static void Main(string[] args) { //方法一: CalculatorAdd cAdd1 = (int x, int y) => { return x + y; }; int result1 = cAdd1(5, 6); //方法二: CalculatorAdd cAdd2 = (x, y) => { return x + y; }; int result2 = cAdd2(5, 6); //方法三: CalculatorAdd cAdd3 = (x, y) => x + y; int result3 = cAdd2(5, 6); } }

第四分钟:泛型委托

随着.net版本的不升级,新版本总要区别于旧版本吧,不然微软的工程师怎么向他们的老大交差呀?所以微软又来玩新花样了。

class Program { static void Main(string[] args) { //方法一: Func<int, int, int> cAdd1 = (int x, int y) => { return x + y; }; int result1 = cAdd1(5, 6); //方法二: Func<int, int, int> cAdd2 = (x, y) => { return x + y; }; int result2 = cAdd2(5, 6); //方法三: Func<int, int, int> cAdd3 = (x, y) => x + y; int result3 = cAdd2(5, 6); } }

不管是匿名方法还是Lambda表达式,完成一个委托的应用,都逃不过两个步骤,一步是定义一个委托,另一步是用一个方法来实例化一个委托。微软干脆把这两步都合成一步来走了。用Func来简化一个委托的定义。

至此一个委托的应用就可用 Func<int, int, int> cAdd3 = (x, y) => x + y; 这样一句话来完成了,其中的Func就是所谓的泛型委托。

第五分钟:表达式树

表达式树其实与委托已经没什么关系了,非要扯上关系,那就这么说吧,表达式树是存放委托的容器。

如果非要说得更专业一些,表达式树是存取Lambda表达式的一种数据结构。

要用Lambda表达式的时候,直接从表达式中获取出来,Compile()就可以直接用了。如下代码:

class Program{ static void Main(string[] args){ Expression<Func<int, int, int>> exp = (x, y) => x + y; Func<int, int, int> fun = exp.Compile(); int result = fun(2, 3); }}

本文作者:QueryWord信息来源:http://cnblogs.com QueryWord

 

 

版权声明:本文来源于网友收集或网友供稿,仅供学习交流之用,如果有侵权,请转告小编或者留言,本公众号立即删除。

关注公众号:DotNet开发跳槽❀觉得不错,请点个在看呀 发布于 2023-02-12 13:10・IP 属地北京

标签:委托,C#,CalculatorAdd,int,delegate,泛型,方法,表达式
From: https://www.cnblogs.com/sexintercourse/p/17167404.html

相关文章

  • 盘点5个C#实用的Word、PPT、Excel、Mail第三方库
    盘点5个C#实用的Word、PPT、Excel、Mail第三方库Dotnet工控C#编程,全网同名欢迎围观交流​关注 2人赞同了该文章今天一起盘点下之前分享的有关W......
  • .net 使用Microsoft.IdentityModel.Tokens.Jwt进行身份认证
    .net使用Microsoft.IdentityModel.Tokens.Jwt进行身份认证2023-02-0408:23·opendotnet什么是JWTJWT(全称:JsonWebToken)是一个开放标准(RFC7519),它定义了一种......
  • BOSHIDA三河博电科技 AC-DC电源模块基本原理及常见问题
    BOSHIDA三河博电科技AC-DC电源模块基本原理及常见问题 AC/DC电源模块的基本原理是从交流源中获取电压,然后由整流器转换为直流电压,且输出能量比输入的电压高,从而达......
  • 87.C# NotifyIcon 托盘控件
    87.C#NotifyIcon托盘控件原创2023-02-0104:51·数字双碳王亮摘要指定可在通知区域创建图标的组件。此类不能被继承。正文如下图,托盘是指程序图标显示在这......
  • 33 个重要的 JavaScript 概念
    33个重要的JavaScript概念原创2022-12-2418:21·程序媛最幽默 了解这33个JavaScript概念绝对会让你将来的职业生涯受益无穷。话不多说,直接进入主题!1.调用栈......
  • 如何在IIS下为typecho开启伪静态
    布署好typecho发现访问的地址是这样的  默认的访问地址可以看出是一个php的动态页面,通过配置,可以让地址看起来像是一个静态页面。  开启伪静态需要以下两个步......
  • Unable to find real location for: <frozen codecs>
    问题描述pycharm在debug时出现了如下bug-------------------------------------------------------------------------------pydevdebugger:CRITICALWARNING:This......
  • .NET 7 和 C# 11 的 7 大自定义扩展方法
    .NET7和C#11的7大自定义扩展方法原创2023-01-1311:59·启辰8 介绍自从我开始了解扩展方法以来,我不断地发现新的可能性,让我的编码生活更轻松。扩展方法是S......
  • 分享 29个超有用的 JavaScript 单行代码(下)
    分享29个超有用的JavaScript单行代码(下)原创2023-02-0321:19·前端达人大家好,在上一篇文章《分享29个超有用的JavaScript单行代码(上)》分享了日期、字符串、数字、数......
  • 分享29个超有用的 JavaScript 单行代码(上)
    分享29个超有用的JavaScript单行代码(上)原创2023-02-0320:13·前端达人在这篇文章中,我列出了一系列29个JavaScript单行代码,它们在使用原生JS(≥ES6)进行开发时非常......