使用.NET中的Action及Func泛型委托
原文 http://www.cnblogs.com/skm-blog/archive/2013/05/24/3096294.html
委托,在C#编程中占有极其重要的地位,委托可以将函数封装到委托对象中,并且多个委托可以合并为一个委托,委托对象则可以像普通对象一样被存储、传递, 之后在任何时刻进行调用,因此,C#中函数回调机制的实现基本上依赖于委托。C#的delegate关键字用于声明委托,它具有将声明委托类型映射到 System.Delegate类的能力,System.Delegate类位于mscorlib.dll中,是.NET的基础核心类之一。使用 delegate关键字声明一个委托,实质上创建了System.Delegate的派生类,因此委托类型并非结构体也不是其它类型,它是一个类。一个委 托对象也就是一个类的实例。以下是Delegate类的声明:
public abstract class Delegate
Delegate是所以委托类型的基类,C#中的多播委托实际上是MulticastDelegate类,它是System.Delegate的派 生类,而本文中介绍的Action、Func泛型委托实际上都是MulticastDelegate类的派生类型。C#中当我们使用delegate关键 字声明一个委托类型时,实际上是由C#编译器根据我们声明时的方法签名帮助我们生成一个与签名匹配的,派生自MulticastDelegate的类。在 泛型大量应用之前,我们写一个C#程序的时候可能会使用delegate关键字声明许多委托类型,因为这些类型都对应于不同的方法签名。通过Visual Studio的对象浏览器查看mscorlib可以看到这两种重要的泛型委托:
其中除了Action之外,其它的委托都是泛型的,其实就是一些泛型类。这便是.NET核心库中全部的泛型委托了。这些泛型委托分为Func、 Action中,它们借助于泛型特性,可以替代C#中几乎所有的委托类型,也就是说一般情况下,在我们的程序中不必再声明任何新的委托类型,就可以包装所 有的函数了。比如我们有两个方法:
public static void OtputString(string str) {Console.WriteLine(str); }public static int Add(int a, int b) {return a + b; }
Func泛型委托与Action相比即多出了一个TResult类型参数,用于函数具有返回值的情况,Action泛型委托用于没有返回值的函数。当我们要获得这两个方法的委托对象时这样变可以了:
var action = new Action<string>(OtputString); action("OutputString Invoked!"); var func = new Func<int, int, int>(Add); var sum = func(3, 5); Console.WriteLine(sum);
可以看见,当我们将具有返回值的函数包装成委托对象时使用Func委托,如果函数没有返回值则使用Action,核心库提供的泛型委托类型参数最短 的为0,最长的为16个。因此,Action及其泛型委托可以匹配无返回值、参数数量为0到16的任何函数。同样的,Func泛型委托可以匹配由返回值、 参数 数量在0到16个的任何函数。一般情况下,程序中函数的参数数量都不会超过16个,即使超过16个,我们可以声明新的泛型委托类型来应对
使用这些泛型委托不会有任何的性能损失,使得程序中委托的使用风格保持一致。唯一的缺点就是类型的名称无法表达具体的用途,举例来讲 EventHandler委托,我们一看名字就知道这是用于事件处理的委托。而使用Action<object,EventArgs>委托我 们则无法从名称看出这种类型的委托是何种用途。
泛型委托有替代所有其它委托的能力,到底应该使用泛型委托还是普通委托、何时使用、在哪种情况下用,可能每个人都有不同的简介,不过说到底,泛型委托能统一程序代码风格以及随处方便使用等优点是非常显著的。
强烈推荐大家看看张子阳的这篇文章:http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html
使用.NET中的Action及Func泛型委托相关推荐
- C#中的Action和Func委托
Action和Func在.NetFramework3.0之后出现的 1. Action 1.1. 特性介绍: Acition 属于无参无返回值的函数类型 Action通过设置泛型,我们可以定义有多个参 ...
- 在.net2.0中实现Action和Func方法
由于这两个是在.net3.5中新加入的特性,所以我们需要自己写一下. 格式如下: delegate void Action(); delegate void Action<T, ...
- C#中的Action和Func 区别
Action只能委托必须是无返回值的方法 Fun只是委托必须有返回值的方法 一.[action<>]指定那些只有输入参数,没有返回值的委托 Delegate的代码: public dele ...
- 第十节:委托和事件(2)(泛型委托、Func和Action、事件及与委托的比较)
一. 泛型委托 所谓的泛型委托,即自定义委托的参数可以用泛型约束,同时内置委托Func和Action本身就是泛型委托. 将上一个章节中的Calculator类中的方法用自定义泛型委托重新实现一下. 1 ...
- Func〈T, TResult〉 泛型委托 以及演变历程
以下内容为菩提树下的杨过根据微软MSDN整理,转贴请注明出处 MSDN对于Func<T, TResult>)的官方解释: 封装一个具有一个参数并返回 TResult 参数指定的类型值的 ...
- C#基础18:内置委托类型Action和Func
前文:https://blog.csdn.net/Jaihk662/article/details/97130647(匿名方法与Lambda表达式) 一.Action泛型委托 Action 为 Sys ...
- C# Delegate、delegate、 Action、 Func
首先Delegate 和delegate,Delegate是类, delegate是关键字,按照官网的解释,使用delegate定义的委托类型,最终会被编译器编译为Delegate类型 Action和 ...
- C#入门级——泛型、泛型类、泛型接口、泛型方法和泛型委托
目录 一.泛型(generic) 二.为什么需要泛型类 类型膨胀 成员膨胀 使用object类 三.泛型的定义 定义泛型类 使用泛型类 泛型接口 两种泛型接口的实现方法 泛型方法 成员膨 ...
- 七天学习计划_c#_[2][3][4][5]委托、事件、委托与事件的区别、泛型委托、Func\Action\predicate
由于委托之前的博客已经详细写了,这里就简单的过一遍,复习一下: 了解委托 基于委托开发事件驱动程序变得非常简单. 使用委托可以大大简化多线程编程难度. 理解委托 委托也可以看做成一种数据类型,可以定义 ...
最新文章
- 利用Python实现十大经典排序算法(附代码流程)
- SAP方丈-写给新手的SAP成本核算流程
- hdfs数据均衡操作命令
- mysql 插入怎么知道id_如何知道刚刚插入数据库那条数据的id
- SVN+AnkhSVN端配置
- mysql联合子查询_2020-09-08MySQL多表联合查询之子查询
- 吴恩达神经网络和深度学习-学习笔记-8-归一化输入Normalizing inputs
- 机器学习--组合分类方法之AdaBoost算法实战(单层决策树原理代码详解)
- Java垃圾回收机制的工作原理
- H.264技术及原理
- 网络安全笔记-网络设备专场(路由器、交换机、防火墙)
- 【Linux 中国】尝试 Nitrux 系统的六大理由
- 有什么软件做笔记比较好用?
- win10开启最小化托盘/系统托盘
- SMTP 与 ESMTP
- SpringBoot(3) 获取后台返回字符串对象及json数据
- 国产FPGA厂商及产品
- 位置 2 的索引无效。数组索引必须为正整数或逻辑值。
- 程控交换机是什么东东!
- windows7下wget下载用法请教(如何跳过已下载文件)