以前自己写委托都用 delegate, 最近看组里的大佬们都用 Func , 以及 Action 来实现, 代码简洁了不少, 但是看得我晕晕乎乎。 花点时间研究一下,记录一下,以便后期的查阅。

1、Func 用法 (封装方法,传入参数, 有返回值)

Func<in T1, in T2, ..., out TResult> (T1, T2, ...)

封装一个方法,该方法有 (0 /1/2/3  ... 16)个参数,且返回由 TResult 参数指定的值的类型。

    public static void Main()
{
// 方法一: Func 相当于系统内置的 委托
Func<int, int, string> method = Calculate; // 方法二: 调用 Lambda 方法实现, 更简洁
Func<int, int, string> method_1 = (x, y) =>
{
int val = x + y;
return string.Format("the calculate {0} plus {1} result is: {2}", x, y, val);
}; Console.WriteLine(method(, ));
Console.WriteLine(method_1(, ));
Console.ReadLine();
} public static string Calculate(int x, int y)
{
int val = x + y;
return string.Format("the calculate {0} plus {1} result is: {2}", x, y, val);
}

2、Action 用法 (封装一个方法, 传入参数, 无返回值)

Action<T1, T2, T3, ...>(t1, t2, t3 ...)

封装一个方法, 该方法传入 (0/1/2 ...) 个参数, 且不返回值。

     public static void Main()
{
Method_First("Hi, Here!");
Method_First("Hi, There!"); Console.ReadLine();
} private static void Method_First(string y)
{
Action<string> method;
method = x => { Console.WriteLine("the input message is: {0}", x); };
method(y);
} private static void Method_Sec(string y)
{
Action<string> method = x => { Console.WriteLine("the input message is : {0}", x); };
method(y);
}

3. 委托的使用

讲了两种不同情况的委托, 那么什么时候使用委托呢?

根据官方文档,在以下情况下,请使用委托:

  • 当使用事件设计模式时。

  • 当封装静态方法可取时。

  • 当调用方不需要访问实现该方法的对象中的其他属性、方法或接口时。

  • 需要方便的组合。

  • 当类可能需要该方法的多个实现时。

4. 在 Task 使用委托

Task 表示一个异步操作。

     public static void Main()
{
// 启动方法1
Task t = Task.Run(() =>
{
Thread.Sleep();
Console.WriteLine("First task finished time is:{0}", DateTime.Now.ToString());
}); // 方法2
Task t_2 = Task.Factory.StartNew(() => {
Thread.Sleep();
Console.WriteLine("second task finished time is:{0}", DateTime.Now.ToString());
}); // 方法 3
Action action = () =>
{
Thread.Sleep();
Console.WriteLine("third task finished time is:{0}", DateTime.Now.ToString());
};
Task.Factory.StartNew(action).ContinueWith(thirdTask =>
{
if (thirdTask.IsCompleted)
{
Console.WriteLine("the third task has finished");
}
else if (thirdTask.IsFaulted)
{
Console.WriteLine(thirdTask.Exception);
}
}); Console.WriteLine("main thread has end:{0}",DateTime.Now.ToString() ); Console.ReadKey();
}

运行结果如下 :

main thread has end:2018-03-04 22:03:39
First task finished time is:2018-03-04 22:03:40
second task finished time is:2018-03-04 22:03:41
third task finished time is:2018-03-04 22:03:42
the third task has finished

c# 委托(Func、Action)的更多相关文章

  1. 委托、多播委托、泛型委托Func,Action,Predicate,ExpressionTree

    当试图通过一个事件触发多个方法,抽象出泛型行为的时候,或许可以考虑使用委托.     通过委托构造函数或委托变量把方法赋值给委托 private delegate double DiscountDel ...

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

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

  3. C#中常见的委托(Func委托、Action委托、Predicate委托)

    今天我要说的是C#中的三种委托方式:Func委托,Action委托,Predicate委托以及这三种委托的常见使用场景. Func,Action,Predicate全面解析 首先来说明Func委托,通 ...

  4. Func 委托 和 Action 委托 初步谈论

    继上篇EventHandler之后,继续填坑,简单了解下Func<TResult> 委托 和 Action 委托. msdn对于两者的解释: Func<TResult>:封装一 ...

  5. 委托, 泛型委托,Func<T>和Action<T>

    使用委托来做一些事情,大致思路是: 1.定义声明一个委托,规定输入参数和输出类型.2.写几个符合委托定义的方法.3.把方法列表赋值给委托4.执行委托 internal delegate int MyD ...

  6. [C#学习笔记]Func委托与Action委托

    学习一项新知识的时候,最好的方法就是去实践它. 前言 <CLR via C#>这本神书真的是太有意思了!好的我的前言就是这个. Fun 如果要用有输入参数,有返回值的委托,那么Func委托 ...

  7. 委托delegate 泛型委托action<> 返回值泛型委托Func<> 匿名方法 lambda表达式 的理解

    1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyB ...

  8. 对委托 以及 action func 匿名函数 以及 lambda表达式的简单记录

    class Program { public delegate void MyDelegate(string str); static void Main(string[] args) { // My ...

  9. C# 委托应用总结(委托,Delegate,Action,Func,predicate)

    C# 委托应用总结 一.什么是委托 1.1官方解释 委托是一种定义方法签名的类型.当实例化委托时,您可以将其实例与任何具有兼容签名的方法相关联.您可以通过委托实例调用方法. 1.2个人理解 委托就是执 ...

  10. 浅谈C#中常见的委托<Func,Action,Predicate>(转)

    一提到委托,浮现在我们脑海中的大概是听的最多的就是类似C++的函数指针吧,呵呵,至少我的第一个反应是这样的. 关于委托的定义和使用,已经有诸多的人讲解过,并且讲解细致入微,尤其是张子阳的那一篇.我就不 ...

随机推荐

  1. Linux指令--性能监控和优化命令相关指令

    原文出处:http://www.cnblogs.com/peida/archive/2012/12/05/2803591.html.感谢作者无私分享 性能监控和优化命令相关指令有:top,free,v ...

  2. centos 如何关闭防火墙?

    1 查看防火墙状态: 命令: /etc/init.d/iptables status 如果是开着显示内容类是截图 2 临时关闭防火墙: 命令:/etc/init.d/iptables stop     ...

  3. promise使用方法

    代码报错会走向失败时的回调 let p = new Promise((resolve, reject) => { throw new Error("我错了"); //会失败 ...

  4. kickstart无人值守

    笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 高逼格装系统的方法 Kickstar Cobbler 注意,kickstart并不是一个服务的名称,只是装系统的方 ...

  5. [python] 2、python使用pyaudio进行录音,及其在python虚拟环境virtualenv中安装遇到的问题

    1.pyaudio安装大背景 最近在做智能音箱,需要编写声音拾取代码,我先是百度两篇比较常见的用python进行录音的操作的文章: python写一个录音小程序:http://blog.csdn.ne ...

  6. MySQL--当查询遇到隐藏字符

    事件起因: 在将一些EXCEL维护的数据导入MySQL中维护过程中发现漏了一些数据,检查时发现看着相同的SQL返回的结果完全不同: 在SQLyog中看到的截图如: 两个SQL执行返回结果不同,其中一条 ...

  7. JavaScript 数值Number类型详解

    Number 问题 如果下面的问题你都能回答对了吗? 0.1 + 0.2 == 0.3 成立吗? .e-5 表示多少? 怎么表示8进制? 怎么转换进制? 如何将字符串转换成数值或整数?反过来呢?十六进 ...

  8. c# 类属性和方法

    属性 public 类字段 就相当于c#里面暴露给外面的属性 类似nodejs的 module.exports 但是属性又不同于普通的字段,属性只是外部包装字段 没有自己的任何含量 类似退换后的方法. ...

  9. 04_Python Data Structures

    Python数据结构 数据结构:数据个体的存储 和 数据个体与个体之间关系的存储. Python中有:1.序列 2.映射类型 3.无序集合 序列:成员有序排列.通过下标偏移量进行访问.元组.字符串.列 ...

  10. ElasticSearch 6 Windows 安装

    前言 目前使用ElasticSearch 6.2最新版本,这里记录其在windows 2012R2系统上的安装步骤. 安装 1. 安装java,最新版本的ElasticSearch 需要java8 版 ...