c# 带返回值的action_C#委托的介绍(delegate、Action、Func、predicate)

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。

1.委托的声明

(1). delegate

delegate我们常用到的一种声明

Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型。

例:public delegate int MethodtDelegate(int x, int y);表示有两个参数,并返回int型。

(2). Action

Action是无返回值的泛型委托。

Action 表示无参,无返回值的委托

Action 表示有传入参数int,string无返回值的委托

Action 表示有传入参数int,string,bool无返回值的委托

Action 表示有传入4个int型参数,无返回值的委托

Action至少0个参数,至多16个参数,无返回值。

例:

public void Test(Action action,T p)

{

action(p);

}

(3). Func

Func是有返回值的泛型委托

Func 表示无参,返回值为int的委托

Func 表示传入参数为object, string 返回值为int的委托

Func 表示传入参数为object, string 返回值为int的委托

Func 表示传入参数为T1,T2,,T3(泛型)返回值为int的委托

Func至少0个参数,至多16个参数,根据返回值泛型返回。必须有返回值,不可void

例:

public int Test(Funcfunc,T1 a,T2 b)

{

return func(a, b);

}

(4) .predicate

predicate 是返回bool型的泛型委托

predicate 表示传入参数为int 返回bool的委托

Predicate有且只有一个参数,返回值固定为bool

例:public delegate bool Predicate (T obj)

2.委托的使用

(1).Delegate的使用

public delegate int MethodDelegate(int x, int y);

private static MethodDelegate method;

static void Main(string[] args)

{

method = new MethodDelegate(Add);

Console.WriteLine(method(10,20));

Console.ReadKey();

}

private static int Add(int x, int y)

{

return x + y;

}

(2).Action的使用

static void Main(string[] args)

{

Test(Action,"Hello World!");

Test(Action, 1000);

Test(p => { Console.WriteLine("{0}", p); }, "Hello World");//使用Lambda表达式定义委托

Console.ReadKey();

}

public static void Test(Action action, T p)

{

action(p);

}

private static void Action(string s)

{

Console.WriteLine(s);

}

private static void Action(int s)

{

Console.WriteLine(s);

}

可以使用 Action 委托以参数形式传递方法,而不用显式声明自定义的委托。 封装的方法必须与此委托定义的方法签名相对应。 也就是说,封装的方法必须具有四个均通过值传递给它的参数,并且不能返回值。 (在 C# 中,该方法必须返回 void)通常,这种方法用于执行某个操作。

(3).Func的使用

static void Main(string[] args)

{

Console.WriteLine(Test(Fun,100,200));

Console.ReadKey();

}

public static int Test(Func func, T1 a, T2 b)

{

return func(a, b);

}

private static int Fun(int a, int b)

{

return a + b;

}

(4). predicate的使用

泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素。

static void Main(string[] args)

{

Point[] points = { new Point(100, 200),

new Point(150, 250), new Point(250, 375),

new Point(275, 395), new Point(295, 450) };

Point first = Array.Find(points, ProductGT10);

Console.WriteLine("Found: X = {0}, Y = {1}", first.X, first.Y);

Console.ReadKey();

}

private static bool ProductGT10(Point p)

{

if (p.X * p.Y > 100000)

{

return true;

}

else

{

return false;

}

}

使用带有 Array.Find 方法的 Predicate 委托搜索 Point 结构的数组。如果 X 和 Y 字段的乘积大于 100,000,此委托表示的方法 ProductGT10 将返回 true。Find 方法为数组的每个元素调用此委托,在符合测试条件的第一个点处停止。

3.委托的清空

(1).在类中申明清空委托方法,依次循环去除委托引用。

方法如下:

public MethodDelegate OnDelegate;

public void ClearDelegate()

{

while (this.OnDelegate != null)

{

this.OnDelegate -= this.OnDelegate;

}

}

(2).如果在类中没有申明清空委托的方法,我们可以利用GetInvocationList查询出委托引用,然后进行去除。

方法如下:

public MethodDelegate OnDelegate;

static void Main(string[] args)

{

Program test = new Program();

if (test.OnDelegate != null)

{

System.Delegate[] dels = test.OnDelegate.GetInvocationList();

for (int i = 0; i < dels.Length; i++)

{

test.OnDelegate -= dels[i] as MethodDelegate;

}

}

}

4.委托的特点

委托类似于 C++ 函数指针,但它们是类型安全的。

委托允许将方法作为参数进行传递。

委托可用于定义回调方法。

委托可以链接在一起;例如,可以对一个事件调用多个方法。

方法不必与委托签名完全匹配。

5.总结:

Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型

Func可以接受0个至16个传入参数,必须具有返回值

Action可以接受0个至16个传入参数,无返回值

Predicate只能接受一个传入参数,返回值为bool类型

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

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

相关文章

html固定表的属性是什么,css如何固定表头

css如何固定表头实现头部导航栏固定用到的属性是&#xff1a;position:sticky 。粘性定位元素(stickily positioned element)是计算后位置属性为 sticky 的元素。盒位置根据正常流计算(这称为正常流动中的位置)&#xff0c;然后相对于该元素在流中的 flow root(BFC)和 containi…

HTML--注册页面案例

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></title> </head> <body> <!--表里标签&#xff1a;action:提交的地址 method&#xff1a; get…

如何给网页标题添加icon小图标

今天给大家分享的是如何在网页标题中加入小图标&#xff0c;就像CSDN前面那个红色的C一样。主要介绍两种方法&#xff1a;1.在html文件的head部分添加下面代码&#xff08;注意href的路径&#xff09;。<link rel"icon" type"image/x-icon" href"i…

科技界内卷化如何破

本文转载自李侠科学网博客撰文 | 李侠&#xff08;上海交通大学科学史与科学文化研究院教授&#xff09;众所周知&#xff0c;2020年内卷化成为一个年度热词&#xff0c;它本是美国文化人类学家吉尔茨&#xff08;Clifford Geertz&#xff0c;1926-2006&#xff09;提出的一个概…

android 内存不足 io,[转]分析ANR或者系统内存崩溃的问题

一&#xff1a;什么是ANRANR:Application Not Responding&#xff0c;即应用无响应二&#xff1a;ANR的类型ANR一般有三种类型&#xff1a;1&#xff1a;KeyDispatchTimeout(5 seconds) --主要类型按键或触摸事件在特定时间内无响应2&#xff1a;BroadcastTimeout(10 seconds)B…

golang map 锁_golang 并发安全Map以及分段锁的实现

涉及概念并发安全Map分段锁sync.MapCAS ( Compare And Swap )双检查分断锁type SimpleCache struct {mu sync.RWMutexitems map[interface{}]*simpleItem}在日常开发中&#xff0c; 上述这种数据结构肯定不少见&#xff0c;因为golang的原生map是非并发安全的&#xff0c;所以为…

动态规划--Leetcode63.不同路径二

一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为“Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为“Finish”&#xff09;。 现在考虑网格中有障碍物。那么从左上角到右下角将…

IEEE:2021年的机遇、挑战以及关键的科技趋势

来源&#xff1a;笑看国际风云【导读】近日&#xff0c;一直致力于通过推动科技进步以造福全人类、全球最大的专业技术组织IEEE&#xff08;电气电子工程师学会&#xff09;&#xff0c;发布了《IEEE全球CIO、CTO访问调研&#xff1a;2021年的机遇和挑战&#xff0c;以及关键的…

MRTG在Windows平台的安装及使用

MRTG (Multi Router Traffic Grapher)是一款监控网络流量负载的免费软件&#xff0c;目前利用MRTG已经开发出了各式各样的统计系统&#xff1a; 1&#xff0e;系统资源负载统计&#xff0c;例如&#xff1a;磁盘空间、CPU负载、内存用量等等 2&#xff0e;Server流量统计&#…

计算机教室应用计划,计算机教室新学期工作计划

无论是单位还是个人&#xff0c;有了工作计划&#xff0c;工作就有了明确的目标和具体的步骤&#xff0c;就可以协调大家的行动&#xff0c;增强工作的主动性&#xff0c;使工作有条不紊地进行。下面是小编整理的计算机教室新学期工作计划&#xff0c;欢迎大家参考!计算机教室新…

语音识别中强制对齐_一种在线语音文本对齐系统及方法

专利名称&#xff1a;一种在线语音文本对齐系统及方法技术领域&#xff1a;本发明涉及电视字幕显示领域&#xff0c;特别涉及一种在线语音文本对齐系统及方法。背景技术&#xff1a;一个国家电视字幕节目的比例&#xff0c;反应了一个国家的人文水平&#xff0c;反应了社会对残…

动态规划--Leetcode121.买卖股票的最佳时机

给定一个数组&#xff0c;它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易&#xff08;即买入和卖出一支股票&#xff09;&#xff0c;设计一个算法来计算你所能获取的最大利润。 注意你不能在买入股票前卖出股票。 示例 1: 输入: [7,1,5,3,6,…

Gradle 下载不了

可自行下载对应的 gradle-x.x-all.zip 放在下列目录 C:\Users\penno\.gradle\wrapper\dists\gradle-4.4-all\9br9xq1tocpiv8o6njlyu5op1 转载于:https://www.cnblogs.com/ouuy/p/9057358.html

边缘AI是内存技术发展的催化剂

来源&#xff1a;北京物联网智能技术应用协会人工智能的崛起&#xff0c;对内存系统提出了一些新要求。今天的内存技术能够满足AI时代下的新应用吗&#xff1f;从长远来看&#xff0c;新兴内存技术对边缘 AI有什么前景?首先要意识到的是“边缘AI”应用没有特定标准;“边缘”在…

一级计算机B理论知识和答案,计算机一级B基础知识选择题答案.doc

计算机一级B基础知识选择题答案.doc计算机基础知识选择题(1)世界上第一台电子计算机诞生于_______年。A)1969B)1946C)1935D)1956【解析】世界上第一台电子数字计算机ENIAC于1946年4月12日诞生于美国。(2)冯诺依曼研制的存储计算机名称是_______。A)EDVAC B)ENIACC)EDSAC D)MARK…

金叉成功率_一个非常强烈的买卖信号:三金叉见顶,三死叉见底,短短10字,但是成功率却远超“金叉买,死叉卖”...

(本文由公众号越声投顾(yslcw927))整理&#xff0c;仅供参考&#xff0c;不构成操作建议。如自行操作&#xff0c;注意仓位控制和风险自负。)为什么做交易的人95%是要被市场打败出局?一、炒股最困难的不是选股&#xff0c;也不是买卖&#xff0c;而是等待;人生最困难的不是努力…

动态规划--Leetcode64.最小路径和

给定一个包含非负整数的 m x n 网格&#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 示例: 输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总…

洛谷 P1824 进击的奶牛 【二分答案】(求最大的最小值)

题目链接&#xff1a;https://www.luogu.org/problemnew/show/P1824 题目描述 Farmer John建造了一个有N(2<N<100,000)个隔间的牛棚&#xff0c;这些隔间分布在一条直线上&#xff0c;坐标是x1,...,xN (0<xi<1,000,000,000)。 他的C(2<C<N)头牛不满于隔间的位…

《中国基础研究竞争力报告2020》发布,6图表速览报告核心结论

来源&#xff1a; 科学出版社持续跟踪先进国家基础研究发展态势&#xff0c;准确研判我国基础研究竞争力&#xff0c;科学筹划基础研究发展&#xff0c;对于打造科技核心竞争力、构筑先发优势、蓄积长远发展原动力&#xff0c;具有重要战略意义。为了支撑科技创新&#xff0c;中…

异步通信在生活中的例子_AJAX简单异步通信实例分析

本文实例讲述了AJAX简单异步通信的方法。分享给大家供大家参考。具体分析如下&#xff1a;客户端&#xff1a;向服务器发出一个空请求。代码如下&#xff1a;XMLHttpRequestvar xmlHttp;function createXMLHttpRequest(){if(window.ActiveXObject)xmlHttp new ActiveXObject(&…