当前位置:  编程技术>.net/c#/asp.net

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

    来源: 互联网  发布时间:2014-11-03

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

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

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

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

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

一、Action类的委托

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

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

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

…… ……

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

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

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

总结:

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

二、Func类的委托

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

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

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

…… ……

17.Func委托 封装一个方法,该方法具有16个参数,并返回TResult参数所指定的类型的值

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

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

总结:

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

三、Predicate委托

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

下面给出Predicate委托的范例:

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

总结:

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

四、Comparison委托

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

下面给出Comparison委托的范例:

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

 总结:

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

值 含义 小于0 x 小于y  0 x 等于y  大于0 x 大于y 
希望本文所述对大家的C#程序设计有所帮助。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • mysql jdbc连接mysql数据库步骤及常见参数详解
  • 解决常见的Eclipse SVN插件报错方法详解
  • 基于C++中常见编译错误的总结详解
  • 基于C/C++ 常见误区详解
  • Java程序员的10道常见的XML面试问答题(XML术语详解)
  • shell脚本中常见的一些特殊符号和作用详解
  • 解析SQLite中的常见问题与总结详解
  • Python常见数据结构详解
  • 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
  • PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
  • 安装hadoop时出现内存不够及其它一些常见的hadoop错误解决办法
  • 常见问题常见问题 搜索搜索 团队团队 个人资料个人资料 您没有新的站内信件您没有新的站内信件 注销 [ tnt_bomb ]注销 [ tnt_b
  • linux/centos安装nginx常见错误及解决办法
  • JSP常见的三个编译指令page、include、taglib
  • 菜鸟急问:一个编译出错的问题(常见的吧)
  • 请问Linux下面有哪些常见的文件后缀名呢?
  • CSS中几种常见的注释
  • 字符不会撑大表格的常见css样式
  • 一个很常见的关于时间的问题。马上结帐!
  • 有一常见问题不解,请大家聊聊!
  • 一个常见的命令行问题
  • 问一个gdb的常见问题
  • mysql常见错误集锦
  • 几种常见攻击的正则表达式
  • UNIX 常见问题
  • 最常见的问题:哪里有Oracle7.3 for sco5.0.5的下载?
  • ./congfigure的时候出错了,很常见的错误..怎么解啊..
  • 强烈要求本版斑竹向CSDN总斑竹申请分版。并把分版的意见放在版顶。并且整理出常见问题的F&Q。
  • web标准常见问题集合第1/2页
  • 为什么常见的bbs用户的登陆名必须为英文,而不用中文?
  • Oracle插入日期数据常见的2个问题和解决方法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3