C#的delegate/event/Action/Func/Predicate关键字

在上一篇《C#4.0的dynamic和var及object关键字辨析》中温习了.net 4.0的dynamic关键字,今天看看C#的delegate/event/Action/Func/Predicate关键字,它们基本上.net 2.0-3.0就有了,不是新的,但新手容易晕。

回顾C#发展的历史,C#1.0完全是模仿Java,并保留了C/C++的一些特性如struct,新学者很容易上手;C#2.0加入了泛型,也与 Java1.5的泛型如出一辙;C#3.0加入了一堆语法糖,并在没有修改CLR的情况下引入了Linq,简直是神来之笔,虽然很多项目出于各种各样如性能之类的原因没有采用,但非常适合小型程序的快速开发,减轻了程序员的工作量,也提高了代码的可读性;C#4.0增加了动态语言的特性,从里面可以看到很多javascript、python这些动态语言的影子。虽然越来越偏离静态语言的道路,但从另一个角度来说,这些特性也都是为了提高程序员的生产力。至于被接受与否,还是让时间来说话吧。

2011-03-11 12h51_29

 

好了,看看C#的delegate/event/Action/Func/Predicate关键字,直接上代码:

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:   
   6:  namespace ConsoleApplication1
   7:  {
   8:      class Program
   9:      {
  10:          public class Test
  11:          {
  12:              public delegate void WriteName(string name);  //定义委托
  13:              public static event WriteName WriteNameEvent; //定义事件
  14:          }
  15:   
  16:          static Action<string> WriteNameAction;//Action是参数从0到4,返回类型为void(即没有返回值)的委托
  17:          static Func<string, int> WriteNameFunction;//Func的参数从1到5个,有返回值的委托,最后一个是返回类型
  18:         
  19:          static void Main(string[] args)
  20:          {
  21:              Test.WriteName myDelegate = x => { Console.WriteLine("abc,{0}!", x); }; // 使用 Lambda 表达式
  22:              myDelegate("teststring");
  23:   
  24:              Test.WriteName w = (string name) => { Console.WriteLine("Hello,{0}!", name); };//使用匿名委托
  25:              w("Jimmy");
  26:   
  27:              Test.WriteNameEvent += (string name) => { Console.WriteLine("Hello,{0}!", name); };//使用匿名委托
  28:              Test.WriteNameEvent += delegate(string name) { Console.Write("test"); }; //使用匿名方法(.net 2.0)
  29:   
  30:              WriteNameAction = HelloWrite; // 匿名委托,和这个一样:WriteNameAction = new Action<string>(HelloWrite);
  31:              WriteNameAction("test");
  32:   
  33:              WriteNameAction = (string name) => { Console.WriteLine("hello,{0}!", name); };//使用匿名委托
  34:              WriteNameAction("test2");
  35:   
  36:   
  37:              WriteNameFunction = HelloWrite2; // 匿名委托,和这个一样:WriteNameFunction = new Func<string, int>(HelloWrite2);
  38:              Console.WriteLine(WriteNameFunction("test3"));
  39:   
  40:              Predicate<int[]> preTest = i => i.Length == 10;
  41:   
  42:              Console.Read();
  43:   
  44:          }
  45:   
  46:          static List<String> listString = new List<String>()
  47:          {
  48:              "One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"
  49:          };
  50:   
  51:          static List<String> GetFirstStringFromList()
  52:          {
  53:              string str = GetStringList(a => { return a.Length <= 3 && a.Contains('S'); });// 使用 Predicate 泛型委托
  54:   
  55:              return listString.FindAll((c) => { return c.Length <= 3; });// 使用 Predicate 泛型委托
  56:          }
  57:   
  58:          static String GetStringList(Predicate<String> p) // 使用 Predicate 泛型委托
  59:          {
  60:              foreach (string item in listString)
  61:              {
  62:                  if (p(item))
  63:                      return item;
  64:              }
  65:              return null;
  66:          }
  67:   
  68:          static void HelloWrite(string name)
  69:          {
  70:              Console.WriteLine("Hello world,{0}!", name);
  71:          }
  72:   
  73:          static int HelloWrite2(string name)
  74:          {
  75:              Console.WriteLine("Hello world,{0}!", name);
  76:              return 1;
  77:          }
  78:      }
  79:  }

posted on   Mainz  阅读(6055)  评论(6编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
历史上的今天:
2008-03-11 开发人员的编程习惯,单元测试意识与软件质量

统计

点击右上角即可分享
微信分享提示