• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#中常见的系统内置委托用法详解

C#中常见的系统内置委托用法详解

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#泛型详解,c#网站开发案例详解,c#关键字详解,c#三层架构详解,c#基础与案例开发详解等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

一般来说,C#在公共语言运行时(CLR)环境中系统为我们内置了一些常用的委托,包括Action类的委托、Func类的委托、Predicate<T>委托、Comparison<T>委托等等。以上这些委托的命名空间都是System,所属程序集都是 mscorlib.dll,今天本文就来讲一讲这些委托的使用方法。

就像我们自己已定义好的一样,要实现某些功能,我们可以直接利用系统内置委托,实例化它们,而不必显式定义一个新委托并将命名方法分配给该委托。如:

public static void Test()
{
  Console.WriteLine("Just For Test");
}
static void Main(string[] args)
{
  Action a = new Action(Test); //直接实例化一个Action委托,不用自己再定义新委托
  a();
}

</div>

只要了解了该系统内置委托是干什么的,传什么参数,返回什么值,大家就可以仿上述例子自行调用,不再赘述。下面是我对这四类委托的总结,并附有结合匿名方法与Lambda表达式的范例,两种方法实现的结果一样,大家可举一反三,灵活运用。

一、Action类的委托

1.Action委托 封装一个方法,该方法不具有参数并且不返回值

2.Action<T>委托 封装一个方法,该方法只有一个参数并且不返回值

3.Action<T1,T2>委托 封装一个方法,该方法具有两个参数并且不返回值

…… ……

17.Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>委托 封装一个方法,该方法具有16个参数并且不返回值

下面以Action<T>委托为例,示范如何使用Action类的委托,该类委托仅仅是参数个数上有区别而已。

static void Main(string[] args)
{
  #region Action<T>委托示例
  //需求:打印出整型集合list的元素
  List<int> list = new List<int>() { 1, 2, 3, 4, 5 };
  //将匿名方法分配给 Action<T> 委托实例
  Action<int> concat1 = delegate(int i) { Console.WriteLine(i); };
  list.ForEach(concat1);
  //将 lambda 表达式分配给 Action<T> 委托实例
  Action<int> concat2 = (i => Console.WriteLine(i));
  list.ForEach(concat2);
  Console.ReadKey();
  #endregion 
}
</div>

总结:

Action类的委托最少可以传入0个参数,最多可以传入16个参数,参数类型皆为逆变,并且不返回值。

二、Func类的委托

1.Func(TResult)委托封装封装一个不具有参数但却返回 TResult 参数指定的类型值的方法

2.Func(T,TResult)委托 封装一个具有一个参数并返回 TResult 参数指定的类型值的方法

3.Func(T1,T2,TResult)委托 封装一个具有两个参数并返回 TResult 参数指定的类型值的方法

…… ……

17.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>委托 封装一个方法,该方法具有16个参数,并返回TResult参数所指定的类型的值

下面以Func<T,TResult>委托为例,示范如何使用Func类的委托,该类委托仅仅是参数个数上有区别而已。

static void Main(string[] args)
{
  #region Func<T,TResult>委托示例
  //需求:查找整型集合list中大于3的所有元素组成的新集合,并打印出集合元素
  List<int> list = new List<int>() { 1, 2, 3, 4, 5 };
  //将匿名方法分配给 Func<T,TResult> 委托实例
  Func<int, bool> concat1 = delegate(int i) { return i > 3; };
  var newlist1 = list.Where(concat1).ToList();
  //将 Lambda 表达式分配给 Func<T,TResult> 委托实例
  Func<int, bool> concat2 = i => i > 3;
  var newlist2 = list.Where(concat2).ToList();
  newlist1.ForEach(i => Console.WriteLine(i.ToString()));
  newlist2.ForEach(i => Console.WriteLine(i.ToString()));
  Console.ReadKey();
  #endregion
}

</div>

总结:

Func类的委托最少可以传入输入泛型参数(in,逆变) 1个,最多可以传入输入泛型参数(in,逆变) 16个,传入的输出泛型参数(out,协变)有且只有一个,这个类型是此委托封装的方法的返回值类型。

三、Predicate<T>委托

表示定义一组条件并确定指定对象是否符合这些条件的方法

下面给出Predicate<T>委托的范例:

static void Main(string[] args)
{
  #region Predicate<T>委托示例
  //需求:查找整型集合list中大于3的所有元素组成的新集合,并打印出集合元素
  List<int> list = new List<int>() { 1, 2, 3, 4, 5 };
  //将匿名方法分配给 Predicate<T> 委托实例
  Predicate<int> concat1 = delegate(int i) { return i > 3; };
  var newlist1 = list.FindAll(concat1);
  //将 lambda 表达式分配给 Predicate<T> 委托实例
  Predicate<int> concat2 = (c => c > 3);
  var newlist2 = list.FindAll(concat2);
  newlist1.ForEach(i => Console.WriteLine(i));
  newlist2.ForEach(i => Console.WriteLine(i));
       Console.ReadKey();
  #endregion
}

</div>

总结:

Predicate<T>委托封装一个方法,该方法传入一个类型参数,这个参数是指要比较的对象的类型,此类型参数是逆变,同时接收一个参数(该参数就是要按照由此委托表示的方法中定义的条件进行比较的对象,参数的类型就是传入的类型参数的类型),该方法始终返回bool类型的值。如果该对象符合由此委托表示的方法中定义的条件,则为 true;否则为 false。

四、Comparison<T>委托

表示比较同一类型的两个对象的方法

下面给出Comparison<T>委托的范例:

static void Main(string[] args)
{
  #region Comparison<T>委托示例
  //需求:将整型集合list中的所有元素倒序排列打印出来
  List<int> list = new List<int>() { 1, 2, 3, 4, 5 };
  //将匿名方法分配给 Comparison<T> 委托实例
  Comparison<int> concat1 = delegate(int i, int j) { return j - i; };
  //将 lambda 表达式分配给 Comparison<T> 委托实例
  Comparison<int> concat2 = (i, j) => j - i;
  list.Sort(concat1);
  list.ForEach(c => Console.WriteLine(c.ToString()));
  list.Sort(concat2);
  list.ForEach(c => Console.WriteLine(c.ToString()));
       Console.ReadKey();
  #endregion
}

</div>

 总结:

Comparison<T>委托封装一个方法,该方法传入一个类型参数,这个参数是指要比较的对象的类型,此类型参数是逆变,同时接收两个同类型的参数(这两个参数就是要比较的两个对象,参数的类型就是传入的类型参数的类型),始终返回int类型的值,即一个有符号整数,指示 x 与 y 的相对值,如下表所示。

值 含义
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#的泛型方法解析
  • C#给Excel添加水印实例详解
  • C#枚举类型和结构体详解
  • C#基础之泛型
  • C#调用Java方法实例详解
  • C#获取机器码的方法详解(机器名,CPU编号,硬盘编号,网卡mac等)
  • C#中数组Array,ArrayList,泛型List详细对比
  • C#泛型委托的用法实例分析
  • C#同步网络时间的方法实例详解
  • C#中的预处理器指令详解

相关文章

  • 2017-05-28C#浅拷贝和深拷贝实例解析
  • 2017-05-28深入理解StringBuilder的使用方法
  • 2017-05-28C#获取哈希加密生成随机安全码的类实例
  • 2017-05-28C# 对MongoDB 进行增删改查的简单操作实例
  • 2017-05-28C# NetRemoting实现双向通信
  • 2017-05-28使用C#获取系统特殊文件夹路径的解决方法
  • 2017-05-28深入理解C#中的Delegate
  • 2017-05-28C#实现从网络同步标准北京时间的方法
  • 2017-05-28C#实现动态生成静态页面的类详解
  • 2017-05-28C#连接Oracle数据库的方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#实现回文检测的方法
    • C#使用smtp发送带附件的邮件实现方法
    • WinForm生成验证码图片的方法
    • c#之圆形无标题栏椭圆窗体的实现详解
    • c#装箱和拆箱知识整理
    • 基于c# 类、接口、结构的联系与区别详解
    • webBrowser代理设置c#代码
    • C#实现复杂XML的序列化与反序列化
    • 浅析泛型类接口定义
    • .net实现序列化与反序列化实例解析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有