c# 最初的时候 只有 delegate,之后的版本封装了Action<T> 、Func<T>、EventHandler<T>

关于Action<T> 

实际上Action<T>  等同于旧版的

  1. public delegate void Action();
  2. public delegate void Action<T1>(T1 arg1);
  3. public delegate void Action<T1, T2>(T1 arg1, T2 arg2);
  4. public delegate void Action<T1, T2, T3>(T1 arg1, T2 arg2, T3 arg3);
  5. public delegate void Action<T1, T2, T3, T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
  6. public delegate void Action<T1, T2, T3, T4, T5>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);

新版写法一:

  1. /// <summary>
  2. /// 应用程序的主入口点。
  3. /// </summary>
  4. [STAThread]
  5. static void Main()
  6. {
  7. //同步执行
  8. Action Action = new Action(writeLine);
  9. Action.Invoke();
  10. //异步执行
  11. Action ActionAsy = new Action(writeLine2);
  12. ActionAsy.BeginInvoke(resual=>Console.WriteLine("异步执行结束"), null);
  13. Console.Read();
  14. }
  15. private static void writeLine()
  16. {
  17. Console.WriteLine("Action同步执行委托");
  18. }
  19. private static void writeLine2()
  20. {
  21. Console.WriteLine("Action异步执行委托");
  22. }

新版写法2(lambda表达式)

  1. /// <summary>
  2. /// 应用程序的主入口点。
  3. /// </summary>
  4. [STAThread]
  5. static void Main()
  6. {
  7. //同步执行 用Lambda表达式代替writeLine
  8. Action Action = new Action(()=>Console.WriteLine("Action同步执行委托"));
  9. Action.Invoke();
  10. //异步执行 用Lambda表达式代替writeLine2
  11. Action ActionAsy = new Action(()=>Console.WriteLine("Action异步执行委托"));
  12. ActionAsy.BeginInvoke(resual=>Console.WriteLine("异步执行结束"), null);
  13. Console.Read();
  14. }

新版写法3(带参数的)

  1. /// <summary>
  2. /// 应用程序的主入口点。
  3. /// </summary>
  4. [STAThread]
  5. static void Main()
  6. {
  7. //同步执行 传入一个参数
  8. Action<string> Action = new Action<string>((a)=>Console.WriteLine(string.Format("Action同步执行委托,传入参数:{0}",a)));
  9. Action.Invoke("小李");
  10. //异步执行 传入两个参数
  11. Action<string,int> ActionAsy = new Action<string,int>((a,b)=>Console.WriteLine("Action异步执行委托,传入参数:{0},{1}",a,b));
  12. ActionAsy.BeginInvoke("小李",,resual=>Console.WriteLine("异步执行结束"), null);
  13. Console.Read();
  14. }

在上面代码中,同步定义的string类型,必须保证传入的参数a也是string。虽然并没有对a进行类型定义,但是系统默认就是事先泛型中定义的类型。类似的,异步委托也是一样。不然会报错。


关于Func<T>

实际上 Func<T>等同于旧版的

  1. public delegate TResult Func<TResult>();
  2. public delegate TResult Func<T1, TResult>(T1 arg1);
  3. public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);
  4. public delegate TResult Func<T1, T2, T3, TResult>(T1 arg1, T2 arg2, T3 arg3);
  5. public delegate TResult Func<T1, T2, T3, T4, TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
  6. public delegate TResult Func<T1, T2, T3, T4, T5, TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);

Func<T>委托的定义是相对于Action<T>来说。Action<T>是没有返回值得方法委托,Func<T>是有返回值的委托。返回值的类型,由泛型中定义的类型进行约束。例如:

  1. /// <summary>
  2. /// 应用程序的主入口点。
  3. /// </summary>
  4. [STAThread]
  5. static void Main()
  6. {
  7. //异步执行
  8. Func<string> FuncAsy = new Func<string>(() =>
  9. {
  10. people tPeo = new people("异步小李", );
  11. return tPeo.ToString();
  12. }
  13. );
  14. FuncAsy.BeginInvoke(resual =>
  15. {
  16. //异步执行,从回调函数中获取返回结果
  17. Console.WriteLine(FuncAsy.EndInvoke(resual));
  18. Console.WriteLine("异步执行结束");
  19. }, null);
  20. //同步执行
  21. Func<string> Func = new Func<string>(() =>
  22. {
  23. people tPeo = new people("同步小李", );
  24. return tPeo.ToString();
  25. }
  26. );
  27. //同步执行,获取返回结果
  28. Console.WriteLine(Func.Invoke());
  29. Console.Read();
  30. }
  31. public class people
  32. {
  33. public string Name { get; set; }
  34. public int Age { get; set; }
  35. public people(string pName, int pAge)
  36. {
  37. this.Name = pName;
  38. this.Age = pAge;
  39. }
  40. public override string ToString()
  41. {
  42. return string.Format("名称叫{0},年龄{1}", this.Name, this.Age);
  43. }
  44. }

多参数新版写法:

  1. /// <summary>
  2. /// 应用程序的主入口点。
  3. /// </summary>
  4. [STAThread]
  5. static void Main()
  6. {
  7. //异步执行 传入一个people类型的参数,返回一个sting类型的结果
  8. Func<people, string> FuncAsy = new Func<people, string>((pPeople) =>
  9. {
  10. return pPeople.Name;
  11. }
  12. );
  13. FuncAsy.BeginInvoke(new people("异步小李", ), resual =>
  14. {
  15. //异步执行,从回调函数中获取返回结果
  16. Console.WriteLine(FuncAsy.EndInvoke(resual));
  17. Console.WriteLine("异步执行结束");
  18. }, null);
  19. //同步执行 传入一个string,int类型的参数,返回一个people类型的结果
  20. Func<string, int, people> Func = new Func<string, int, people>((pName,pAge) =>
  21. {
  22. people tPeo = new people(pName, pAge);
  23. return tPeo;
  24. }
  25. );
  26. //同步执行,返回结果
  27. Console.WriteLine(Func.Invoke("同步小李",).ToString());
  28. Console.Read();
  29. }

关于EventHandler<T>

实际上 EventHandler<T> 等同于旧版的

  1. public delegate void CustomEventHandler(object sender, CustomEventArgs a);
  2. public event CustomEventHandler RaiseCustomEvent;

新版写法:

  1. public event EventHandler<CustomEventArgs> RaiseCustomEvent;

1:EventHandler实际上就是一个特殊的委托,它是由.NET预定义好的一个委托,它的形式是固定的。
2:使用EventHandler时,处理函数的返回值必须是Void类型,而使用Deleagate则没有这个限制。
3:Delegate相当于一个函数的指针,用于绑定的函数返回值和参数列表要符合Delegate声明时的要求。

参考资料:http://www.cnblogs.com/cglNet/p/3395954.html

关于Action<T> 、Func<T>、EventHandler<T>、event、delegate的更多相关文章

  1. C#扫盲篇(三):Action和Func委托--实话实说

    一.基础定义 老王想找老张的老婆出去耍,但是一看,老张还在厨房煮饭.于是老王就对老张隔壁的淑芬说:"等下老张吃完饭出去喝茶,你就把前门晒的苞谷收了,老张从左门出,你就收右边的苞谷,我就知道从 ...

  2. .NET中的Action及Func泛型委托

    委托,在C#编程中占有极其重要的地位,委托可以将函数封装到委托对象中,并且多个委托可以合并为一个委托,委托对象则可以像普通对象一样被存储.传递,之后在任何时刻进行调用,因此,C#中函数回调机制的实现基 ...

  3. 使用.NET中的Action及Func泛型委托

          委托,在C#编程中占有极其重要的地位,委托可以将函数封装到委托对象中,并且多个委托可以合并为一个委托,委托对象则可以像普通对象一样被存储.传递,之后在任何时刻进行调用,因此,C#中函数回调 ...

  4. Delegate、Predicate、Action和Func

    写在前面 Delegate Predicate Action Func 逆变和协变 先说下什么是委托(Delegate),委托在C#中是一种类型,和Class是一个级别,但是我们经常把它看做是一个方法 ...

  5. VS2012 Unit Test(Void, Action, Func) —— 对无返回值、使用Action或Func作为参数、多重载的方法进行单元测试

    [提示] 1. 阅读文本前希望您具备如下知识:了解单元测试,了解Dynamic,熟悉泛型(协变与逆变)和Lambda,熟悉.NET Framework提供的 Action与Func委托.2.如果您对单 ...

  6. EXPLAINING WHAT ACTION AND FUNC ARE

    http://simpleprogrammer.com/2010/09/24/explaining-what-action-and-func-are/ Explaining What Action A ...

  7. C#系统委托之Action And Func

    Action Action<T> Func Func<T> Action:封装一个方法,该方法不具有参数并且不返回值 public delegate void Action() ...

  8. Action<>和Func<> 委托【代理】

    C#中的Action<>和Func<> 其实他们两个都是委托[代理]的简写形式. 一.[action<>]指定那些只有输入参数,没有返回值的委托 Delegate的 ...

  9. [C#] 委托之Action和Func区别

    一.说明 一般我们定义委托都是有如下两步: public delegate void MyDelegate(string name);//定义委托 public MyDelegate myDelega ...

  10. C#高级功能(三)Action、Func,Tuple

    Action和Func泛型委托实际上就是一个.NET Framework预定义的委托,3.5引入的特性.基本涵盖了所有常用的委托,所以一般不用用户重新声明. Action系列泛型委托,是没有返回参数的 ...

随机推荐

  1. Android开发之Java必备基础

    Android开发之Java必备基础 Java类型系统 Java语言基础数据类型有两种:对象和基本类型(Primitives).Java通过强制使用静态类型来确保类型安全,要求每个变量在使用之前必须先 ...

  2. 解决"waitForCondition(LockCondition) timed out (identity=23, status=0). CPU may be pegged. trying again."问题

    前几天在跑游戏引擎的时候,遇到了一个比较奇怪的问题,logcat不断地打印下面的错误: waitForCondition(LockCondition) timed out (identity=23, ...

  3. Java-->把txt中的所有字符按照码表值排序

    --> List 列表中的自动添加的多余空间长度该怎么去除呢?...(已解决,是char 数组中的空字符) package com.dragon.java.filesort; import ja ...

  4. 143. Reorder List

    Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do thi ...

  5. 学习chrome 插件 DHC ,http请求传参方法

    DHC的简介 DHC是一款可以帮助用户使用chrome插件模拟HTTP客户端发送测试数据到服务器的谷歌浏览器插件,在chrome中安装了DHC插件以后,就可在服务器端代码初步完成的时候,使用DHC进行 ...

  6. jsp页面 date转化成string

    1.先引入fmt标签<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> ...

  7. SpringMVC 自定义参数绑定实现日期类型绑定

    package cn.itcast.ssm.controller.converter; import java.text.ParseException; import java.text.Simple ...

  8. JavaScript BOM 遗漏知识再整理;弹窗和记时事件;

    1.JavaScript 弹窗 警告框 警告框经常用于确保用户可以得到某些信息. 当警告框出现后,用户需要点击确定按钮才能继续进行操作. window.alert() 方法可以不带上window对象, ...

  9. leetcode 146. LRU Cache ----- java

    esign and implement a data structure for Least Recently Used (LRU) cache. It should support the foll ...

  10. 移动端动画使用transform提升性能

    在移动端做动画,对性能要求较高而通常的改变margin属性是性能极低的,即使使用绝对定位改变top,left这些属性性能也很差因此应该使用transform来进行动画效果,如transform:tra ...