C# 实例详解委托之Func、Action、delegate(精品)

概述

     委托是.NET编程的精髓之一,在日常编程中经常用到,在C#中实现委托主要有Func、Action、delegate三种方式,本节主要就这三种委托的用法通过实例展开讲解。

Func用法解析

     【Func】:Func是带返回值的委托:

原型函数如下(以下展示的是有两个参数的情况):

public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);

用法举例1: 定义方法StringAddA

public int StringAddA(string a, string b){return int.Parse(a) + int.Parse(b);}

定义委托func,然后把方法StringAddA委托给它,接下来执行委托并获取结果,注意:

Func<string, string, int> func = StringAddA;
是
Func<string, string, int> func = new Func<string, string, int>(StringAddA);的简写
Func<string, string, int> func = StringAddA;//简写var result = func.Invoke("3", "5");//可以简化为func("3", "5")sw.AppendLine($"【func用法1】func返回结果是:{result}");

这里的执行结果是: 【func用法1】func返回结果是:8

用法举例2: 

用lamda表达式简化写法,通过+=注册实现多播委托

func += (a, b) =>{return int.Parse(a) - int.Parse(b);};sw.AppendLine($"【func用法2】func返回结果是:{func("3", "5")}");

这里的执行结果是: 【func用法1】func返回结果是:-2

注意 += 可以注册多个委托,委托执行后会按顺序执行方法.

Action用法解析

     【Action】:Action是无返回值的委托:

原型函数如下(以下展示的是有两个参数的情况):

public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);

用法举例:

先定义方法:StringAddB

public void StringAddB(string a, string b){sw.AppendLine($"【Action用法】Action执行结果:{(int.Parse(a) + int.Parse(b))}");}

实例如下:

Action<string, string> action = StringAddB;//简写IAsyncResult asyncResult = action.BeginInvoke("3", "5", null, null);//action("3", "5"),BeginInvoke异步执行,即:开启新现成处理StringAddBaction.EndInvoke(asyncResult);//阻塞委托,直到执行完成if (asyncResult.IsCompleted){sw.AppendLine($"【Action用法】当前异步委托线程已执行完成");}

这里BeginInvoke是异步委托,即新开线程去处理,我们的窗体线程在1号线程,这里我们可以在StringAddB里面打印线程id号

sw.AppendLine($"【Action用法】Action执行线程id:{Thread.CurrentThread.ManagedThreadId}");

运行结果:

【Action用法】Action执行线程id:3

这里的EndInvoke是阻塞委托,直到执行完成,当然我们这里也可以用同步的Invoke去执行,甚至Invoke都可以简写去掉,直接写成action("3", "5")

delegate用法解析

    【delegate】:delegate是可以有返回值也可以没返回值的委托:

使用前需要先声明:

delegate int DelegateM(string a, string b);//声明,可以有返回值也可以没有

用法举例:

//delegate用法//DelegateM delegateM = new DelegateM(p.StringAddA);DelegateM delegateM = StringAddA;//简写sw.AppendLine($"【delegate用法】delegate返回结果是:{delegateM("3", "5")}");

以上就是三种委托的区别和用法讲解,那使用委托最大的优势是什么:

可以将方法当作参数去传递,用法举例如下:

Test(func, action);//将方法委托后转化为参数进行传递

定义方法

public void Test(Func<string, string, int> f, Action<string, string> a){a.Invoke(f.Invoke("3", "5").ToString(), "5");}

以上就是本节全部内容,下节将针对事件委托展开讲解,敬请关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django05-2:路由分发/命名空间/伪静态/虚拟环境/django版本区别

路由分发 补充&#xff1a;每一个应用可以有独立的templates模板文件夹&#xff0c;static静态文件加&#xff0c;urls.py 总路由 #方法一from app01 import urls as app01_urls from app02 import urls as app02_urlsurlpatterns [url(r^publisher_list/, views.publisher_…

Word中查找替换软回车键和回车键

在Word中使用搜索功能搜索“^p”组合字符串可以查找文档中的所有换行符&#xff08;回车键&#xff09;&#xff0c;使用“^l”&#xff08;英文输入状态下shift6与小写字符L的组合&#xff09;可以搜索所有的软回车符。使用替换功能就可以搜索替换二者。转载于:https://www.cn…

minecraft服务器_如何使用Minecraft领域设置简单的无压力Minecraft服务器

minecraft服务器There are a lot of ways to go about hosting a Minecraft game but it’s tough to beat the simplicity of buying a server directly from Mojang, the company behind Minecraft (and now it even comes with a free 30 day trial!) Read on as we show yo…

自动化测试基础篇--Selenium浏览器操作

Selenium 主要提供的是操作页面上各种元素的方法&#xff0c;但它也提供了操作浏览器本身的方法&#xff0c;比如浏览器的大小以及浏览器后退、前进按钮等。一、控制浏览器窗口大小有时候我们希望能以某种浏览器尺寸打开&#xff0c;让访问的页面在这种尺寸下运行。例如可以将浏…

Sublime text3配置xdebug调试记录

第一次配置遇到的问题记录&#xff1b; 问题&#xff1a;配置php.ini的时候xdebug.remote_port 9001刚开始我一直配置9000端口冲突,然后一切弄好了访问浏览器就一直在转圈无法访问&#xff1b; 现在开始配置&#xff1a; 1.打开sublime 输入install Package如下显示在按回车&a…

.NET Conf China 2022 今天(12.4) 日程一览

点击蓝字关注我们.NET Conf China 2022 诚邀您的加入立即扫码预约加入.NET年度盛宴&#xff01;&#xff01;CSDN 直播https://bbs.csdn.net/forums/DotNET?typeId20680 思否直播https://segmentfault.com/area/dotnetconf-2022主论坛分论坛前端专场-A会场出品人&#xff1a;张…

移动web开发适配rem

移动的meta标签 <meta name"viewport" content"widthdevice-width, initial-scale1,user-scalableno"> 常见移动web适配方法&#xff1a; 1.定高&#xff0c;百分比布局 2.flex布局 3.media媒体查询 rem&#xff08;font size of the root element…

Django06:视图层/上传文件/request 方法补充/FBV与CBV

三板斧 HttpResponse, 返回字符串类型render, 返回html页面&#xff0c;而且在返回给浏览器之前&#xff0c;可以给html文件传值redirect 重定向 总结&#xff1a;视图函数必须返回一个HttpResponse对象&#xff0c; 查看源代码能发现。 JsonResponse对象 json用途&#x…

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一2.4.6 为克隆使用序列化

2.4.6 为克隆使用序列化 序列化机制有一种很有趣的用法&#xff1a;即提供了一种克隆对象的简便途径&#xff0c;只要对应的类是可序列化的即可。其做法很简单&#xff1a;直接将对象序列化到输出流中&#xff0c;然后将其读回。这样产生的新对象是对现有对象的一个深拷贝&…

谈谈ASP.NET Core过滤器和中间件的区别

什么是中间件中间件Middleware是所有请求都会执行的,适合用在权限校验,一些公用字段处理,例如分页信息获取.asp.net core 提供了IApplicationBuilder接口来让把中间件注册到asp.net的管道请求当中去&#xff0c;中间件是一个典型的AOP应用。下面是一个微软官方的一个中间件管道…

11 个 Nginx 参数性能优化工作

工作上&#xff0c;需要配置 Nginx&#xff0c;要投入生产使用&#xff0c;做了一点优化工作&#xff0c;加上以前也经常折腾 Nginx&#xff0c;故记下一些优化工作。 优化 Nginx 进程数量 配置参数如下&#xff1a; worker_processes 1; # 指定 Nginx 要开启的进程数&#xff…

如何在Windows 8中将旧控制面板添加到Metro Start屏幕

By default there is no way to easily access the old Control Panel in Windows 8, in order to get to it you have to go through the new Metro Control Panel or switch to Explorer. Here’s how to create your own tile for it. 默认情况下&#xff0c;无法轻松访问Wi…

vue子父组件间传值

父组件传值给子组件 props方式   父组件上1处声明传递的键并赋值&#xff0c;子组件2处使用props接收一下这个键就可以使用了。在父组件改变这个值的话子组件跟着一起响应&#xff0c;子组件改变这个值的话父组件不改变。次为响应式&#xff0c;但是也仅限于父组件的值变化子…

Django07:模板语法/标签/inclusion_tag/模版的继承

模板语法传值 列表&#xff1a;l[a,b,c] 集合&#xff1a;se{‘a’,yy,ss} 元组&#xff1a;t(111,222,333) render(request.index,html,locals()) 语法规律 {{}}:变量相关 {%%}:逻辑相关 {{func}} 会自动加括号执行&#xff0c;但不支持带参数&#xff1b; 带参数会不…

红象云腾发布新一代PB级高速大数据平台产品

ZD至顶网服务器频道 03月23日 新闻消息&#xff1a;在3月19日举办的China Hadoop Summit&#xff08;中国Hadoop技术峰会&#xff09;上&#xff0c;中国Hadoop大数据厂商红象云腾与OpenPOWER基金会共同发布红象云腾的新一代大数据产品,帮助企业高速处理PB规模数据。 此次发布…

个人笔记 Vue.js, Framework7, and Cordova / PhoneGap Template with Babel, Webpack and Hot Reloading...

为什么80%的码农都做不了架构师&#xff1f;>>> 模板创建项目 模板地址 更新package.json中的dependencies依赖到最新版本 当新建一个项目的时候&#xff0c;从其他项目的package.json里面copy一份dependencies过来。 但因为是新项目&#xff0c;我们想用各个依赖包…

dotnet-exec 0.12.0 released

dotnet-exec 0.12.0 releasedIntrodotnet-exec 是一个 C# 程序的小工具&#xff0c;可以用来运行一些简单的 C# 程序而无需创建项目文件&#xff0c;让 C# 像 python/nodejs 一样简单&#xff0c;而且可以自定义项目的入口方法&#xff0c;支持但不限于 Main 方法。Install/Upd…

美国用户现在可以下载其所有Apple帐户数据,这是操作方法

Starting today, Apple is allowing all US users to download a copy of every last bit of their data from the company. 从今天开始&#xff0c;Apple允许所有美国用户从该公司下载其数据的最后一部分的副本。 This feature has been available for EU users since May, th…

java 的原码、补码、反码小总结

先看一个代码吧: int h; return (key null) ? 0 : (h key.hashCode()) ^ (h >>> 16); 这个应该很熟悉吧,是 java 里 HashMap 的计算 hash 值的方法.这里有一个运算符 "^"&#xff0c;他其实就是使用补码来运算的.好了&#xff0c;那么我们下面来说说这些…

Django08:模型层(ORM)--测试脚本/必知的13条/神器的双下划线查询/多表操作

单表操作 django 自带的sqlite3数据库对日期格式不是很敏感&#xff0c;处理的时候容易出错。 测试脚本 测试环境准备&#xff1a;去manage.py 中拷贝钱四行代码&#xff0c;然后自己手写两行。 脚本无论在引用下面&#xff0c;还是单独开设PY文件都可以。 import os impor…