CLR环境中内置了几个常用委托(转)

CLR环境中给我们内置了几个常用委托Action、 Action<T>、Func<T>、Predicate<T>,一般我们要用到委托的时候,尽量不要自己再定义一 个委托了,就用系统内置的这几个已经能够满足大部分的需求,且让代码符合规范。
一、Action

Action封装的方法没有参数也没有返回值,声明原型为:

1 public delegate void Action();

用法如下:

public void Alert()
 {
    Console.WriteLine("这是一个警告");
 }

 Action t = new Action(Alert); //  实例化一个Action委托
 t();

如果委托的方法里的语句比较简短,也可以用Lambd表达式直接把方法定义在委托中,如下:

Action t = () => { Console.WriteLine("这是一个警告"); };
 t();

二、Action<T>

Action<T>是Action的泛型实现,也是没有返回值,但可以传入最多16个参数,两个参数的声明原型为:

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

用法如下:

private void ShowResult(int a, int b)
{
    Console.WriteLine(a + b);
}

Action<int, int> t = new Action<int, int>(ShowResult);//两个参数但没返回值的委托
t(2, 3);

同样也可以直接用Lambd表达式直接把方法定义在委托中,代码如下:

Action<int, int> t = (a,b) => { Console.WriteLine(a + b); };
t(2, 3);

三、Func<T>

Func<T>委托始终都会有返回值,返回值的类型是参数中最后一个,可以传入一个参数,也可以最多传入16个参数,但可以传入最多16个参数,两个参数一个返回值的声明原型为:

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

用法如下:

public bool Compare(int a, int b)
{
    return a > b;
}

Func<int, int, bool> t = new Func<int, int, bool>(Compare);//传入两个int参数,返回bool值
bool result = t(2, 3);

同样也可以直接用Lambd表达式直接把方法定义在委托中,代码如下:

Func<int, int, bool> t = (a, b) => { return a > b; };
 bool result = t(2, 3);

四 、Predicate<T>

Predicate<T>委托表示定义一组条件并确定指定对象是否符合这些条件的方法,返回值始终为bool类型,声明原型为:

1 public delegate bool Predicate<in T>(T obj);

用法如下:

public bool Match(int val)
{
    return val > 60;
}

Predicate<int> t = new Predicate<int>(Match);   //定义一个比较委托
int[] arr = { 13, 45, 26, 98, 3, 56, 72, 24 };
int first = Array.Find(arr, t);                 //找到数组中大于60的第一个元素

同样也可以直接用Lambd表达式直接把方法定义在委托中,代码如下:

Predicate<int> t = val => { return val > 60;};   //定义一个比较委托
 int[] arr = { 13, 45, 26, 98, 3, 56, 72, 24 };            
 int first = Array.Find(arr, t);                  //找到数组中大于60的第一个元素

总结:

如果要委托的方法没有参数也没有返回值就想到Action
   有参数但没有返回值就想到Action<T>
   无参数有返回值、有参数且有返回值就想到Func<T>
   有bool类型的返回值,多用在比较器的方法,要委托这个方法就想到用Predicate<T>

时间: 2024-08-01 06:42:46

CLR环境中内置了几个常用委托(转)的相关文章

函数中内置对象

函数的3大内置对象,在这里只写了2个,其中一个比较重要,而且在工作中很多人搞不懂,this到底代表谁.所以我单独写出来了 函数中内置的三大对象 1.arguments对象 2.环境变量对象 3.this对象 arguments对象 用于保存实参(它只存在于函数中,函数外不能调用,具有数组所有的功能,但它不是数组) arguments对象通过索引值来访问保存在其中的实参值 <script type="text/javascript"> function show(a,b){

Update升级包中内置第三方app案例

Update升级包中内置第三方app案例 Update升级包中内置第三方app案例 介绍 总结内容 1 问题现象 2 原因分析 3 解决方案 Androidmk preinstallsh 4 后续工作中须注意细节 扩展阅读 1. 介绍 Amlogic MX8726 5iHome项目,客户提出需求在固件中预制第三方app 请列出开发的项目,项目简单背景,使用的平台,待总结的内容简述 2. 总结内容 2.1 问题现象: 客户提供第三方app直接使用U盘pm install YouKu_CIBN.ap

JavaScript中内置对象的一些属性及方法

Javascript对象总结 JS中内置了17个对象,常用的是Array对象.Date对象.正则表达式对象.string对象.Global对象 Array对象中常用方法: Concat():表示把几个数组合并成一个数组. Join():返回字符串值,其中包含了连接到一起的数组的所有元素,元素由指定的分隔符分隔开来. Pop():移除数组最后一个元素. Shift():移除数组中第一个元素. unshift():在数组的第一项Slice(start,end):返回数组中的一段. Push():往数

DataGridView中内置控件常用事件使用心得

checkbox,button,imagebutton使用dataGridView1_CellContentClick private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { tb.Text+=string.Format("\r\n{0},Row:{1},Column:{2}","单元格内容单击!",e.RowIndex,e.ColumnInd

java8中内置的四大核心函数式接口

java8中内置的四大核心函数式接口 Consumer<T>:消费型接口 void accept(T t) //Consumer<T> 消费型接口 public void happy(double money, Consumer<Double> con){ con.accept(money); } Supplier<T>:供给型接口 T get(); //Supplier<T> 供给型接口 //需求:产生一些整数,并放入集合中 public Li

Python中内置函数的介绍

内置函数的功能介绍 常用内置函数如下: 1.abs() 绝对值 格式:abs(x) 例如:print(abs(-18)) >>> 18 返回值:number #该函数主要用于数值类的操作 2.all() 是否都为真 格式:all(iterable) 例如:print(all([1,2,3,])) >>> Ture 返回值:bool #该函数主要用于可迭代对象的操作,主要为列表.元祖.字典和集合.当这些类型的元素中有空字符串.空列表.空元祖.空字典.空集合时,则返回值为F

装饰器、生成器、迭代器、及python中内置函数的使用

一. 装饰器 1. 装饰器的概述 (1)概述:装饰器本质就是函数,主要用来装饰其他函数,为其他函数添加附加功能. (2)使用装饰器的原则 1)不能修改被装饰的函数的源代码 2)不能修改被装饰的函数的调用方式 (3)装饰器原理:函数即"变量".高阶函数.嵌套函数 2.使用装饰器的原因 (1)传统的多个函数模块修改需要同时修改多个函数.如果函数过多,则修改不方便. 如下,如果想要在每个函数中开头结尾分别输入内容,则需要在每个函数开头结尾加入需要输出的内容. def f1():     pr

高效利用Angular中内置服务

AngularJS中为我们提供了众多的内置服务,通过这些内置服务可以轻松的实现一些常用功能.下面对Angular中常用的内置服务进行一下总结. 1.$location服务 $location服务用于返回当前页面的URL地址,示例代码如下: var app = angular.module('myApp', []); app.controller('customersCtrl', function($scope, $location) { $scope.myUrl = $location.absU

ES6新特性:Javascript中内置的延迟对象Promise

Promise的基本使用: 利用Promise是解决JS异步执行时候回调函数嵌套回调函数的问题, 更简洁地控制函数执行流程: 通过new实例化Promise,  构造函数需要两个参数, 第一个参数为函数执行成功以后执行的函数resolve, 第二个函数为函数执行失败以后执行的函数reject: new Promise(function(resolve , reject) { }); 通过Promise,我们把回调函数用线性的方式写出来,而不是一层套一层, 这个函数有四层回调: fn("args&