.NET使用Action及Func泛型委托
来源:互联网 发布:统计年鉴数据库 编辑:程序博客网 时间:2024/05/29 14:31
来自:http://www.csharpwin.com/csharpspace/13432r2726.shtml
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#中几乎所有的委托类型,也就是说一般情况下,在我们的程序中不必再声明任何新的委托类型,就可以包装所有的函数了。比如我们有两个方法:
Func泛型委托与Action相比即多出了一个TResult类型参数,用于函数具有返回值的情况,Action泛型委托用于没有返回值的函数。当我们要获得这两个方法的委托对象时这样变可以了:public static void OtputString(string str){ Console.WriteLine(str);}public static int Add(int a, int b){ return a + b;}
可以看见,当我们将具有返回值的函数包装成委托对象时使用Func委托,如果函数没有返回值则使用Action,核心库提供的泛型委托类型参数最短的为0,最长的为8个。因此,Action及其泛型委托可以匹配无返回值、参数数量为0到8的任何函数。同样的,Func泛型委托可以匹配由返回值、参数数量在0到8个的任何函数。一般情况下,程序中函数的参数数量都不会超过8个,即使超过8个,我们可以声明新的泛型委托类型来应对。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);
delegate void Action<T1, T2, T3, T4, T5, T6, T7, T8, T9>(T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8, T9 p9);
使用这些泛型委托不会有任何的性能损失,使得程序中委托的使用风格保持一致。唯一的缺点就是类型的名称无法表达具体的用途,举例来讲EventHandler委托,我们一看名字就知道这是用于事件处理的委托。而使用Action<object,EventArgs>委托我们则无法从名称看出这种类型的委托是何种用途。
泛型委托有替代所有其它委托的能力,到底应该使用泛型委托还是普通委托、何时使用、在哪种情况下用,可能每个人都有不同的简介,不过说到底,泛型委托能统一程序代码风格以及随处方便使用等优点是非常显著的。
- .NET使用Action及Func泛型委托
- .net Delegate ,Func ,Action 委托
- 泛型委托 Predicate/Func/Action
- 泛型委托学习(Func和Action)
- C# 泛型委托 Action/Func
- 泛型委托 Predicate/Func/Action
- 泛型委托Action与func
- Func与Action委托泛型介绍
- Action 和 Func 泛型封装委托
- .NET : Func委托和Action委托
- .NET : Func委托和Action委托
- 泛型委托 Predicate/Func/Action ,c#扩展方法
- C#的泛型委托Predicate/Func/Action
- Action、Func、Predicate 和 Converter 泛型委托详解
- Action<T>和Func<T>泛型委托
- Action<T>和Func<T>泛型委托
- C#令人惊喜的泛型委托Predicate、Func、Action
- Action<T>和Func<T>泛型委托
- 学习 HTML5 最好的几个网站
- PyChecker使用
- android jni中的几个注意事项
- 关于编码ansi、GB2312、unicode与utf-8的区别
- UNA 工具概览(五)——Betweenness指数示例
- .NET使用Action及Func泛型委托
- 【Java】将证书导入Java的JRE环境
- 局域网通讯工具学习总结
- C#多线程学习(二) 如何操纵一个线程
- 最全的Android源码目录结构详解
- java面试题经典20例【第一季_常瑞鹏】
- 更改tomcat的server.xml 访问非工程目录下的文件(其他磁盘下的文件)
- FFMpeg的解码流程
- C#多线程学习(三) 生产者和消费者