Func<T>与Action<T>委托泛型介绍
.Net 3.5之后,微软推出了Func<T>与Action<T>泛型委托。进一步简化了委托的定义。
Action<T>委托主要的表现形式如下:
public delegate void Action();
public delegate void Action<T1>(T1 arg1);
public delegate void Action<T1, T2>(T1 arg1, T2 arg2);
public delegate void Action<T1, T2, T3>(T1 arg1, T2 arg2, T3 arg3);
public delegate void Action<T1, T2, T3, T4>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
public delegate void Action<T1, T2, T3, T4, T5>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);
从Action<T>的定义形式上可以看到。Action<T>是没有返回值得。适用于任何没有返回值得方法。例如:
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
//同步执行
Action Action = new Action(writeLine);
Action.Invoke();
//异步执行
Action ActionAsy = new Action(writeLine2);
ActionAsy.BeginInvoke(resual=>Console.WriteLine("异步执行结束"), null);
Console.Read();
}
private static void writeLine()
{
Console.WriteLine("Action同步执行委托");
}
private static void writeLine2()
{
Console.WriteLine("Action异步执行委托");
}
如果调用Lambda表达式,可以更简练,对上面的代码,可以这样写:
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
//同步执行 用Lambda表达式代替writeLine
Action Action = new Action(()=>Console.WriteLine("Action同步执行委托"));
Action.Invoke();
//异步执行 用Lambda表达式代替writeLine2
Action ActionAsy = new Action(()=>Console.WriteLine("Action异步执行委托"));
ActionAsy.BeginInvoke(resual=>Console.WriteLine("异步执行结束"), null);
Console.Read();
}
private static void writeLine()
{
Console.WriteLine("Action同步执行委托");
}
private static void writeLine2()
{
Console.WriteLine("Action异步执行委托");
}
如果有参数需要传入,Action<T>可以这么做,例如:
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
//同步执行 传入一个参数
Action<string> Action = new Action<string>((a)=>Console.WriteLine(string.Format("Action同步执行委托,传入参数:{0}",a)));
Action.Invoke("小李");
//异步执行 传入两个参数
Action<string,int> ActionAsy = new Action<string,int>((a,b)=>Console.WriteLine("Action异步执行委托,传入参数:{0},{1}",a,b));
ActionAsy.BeginInvoke("小李",,resual=>Console.WriteLine("异步执行结束"), null);
Console.Read();
}
在上面代码中,同步定义的string类型,必须保证传入的参数a也是string。虽然并没有对a进行类型定义,但是系统默认就是事先泛型中定义的类型。类似的,异步委托也是一样。不然会报错。
Func<T>委托主要的表现形式如下:
public delegate TResult Func<TResult>();
public delegate TResult Func<T1, TResult>(T1 arg1);
public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);
public delegate TResult Func<T1, T2, T3, TResult>(T1 arg1, T2 arg2, T3 arg3);
public delegate TResult Func<T1, T2, T3, T4, TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4);
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>是有返回值的委托。返回值的类型,由泛型中定义的类型进行约束。例如:
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
//异步执行
Func<string> FuncAsy = new Func<string>(() =>
{
people tPeo = new people("异步小李", );
return tPeo.ToString();
}
);
FuncAsy.BeginInvoke(resual =>
{
//异步执行,从回调函数中获取返回结果
Console.WriteLine(FuncAsy.EndInvoke(resual));
Console.WriteLine("异步执行结束");
}, null);
//同步执行
Func<string> Func = new Func<string>(() =>
{
people tPeo = new people("同步小李", );
return tPeo.ToString();
}
);
//同步执行,获取返回结果
Console.WriteLine(Func.Invoke());
Console.Read();
}
public class people
{
public string Name { get; set; }
public int Age { get; set; }
public people(string pName, int pAge)
{
this.Name = pName;
this.Age = pAge;
}
public override string ToString()
{
return string.Format("名称叫{0},年龄{1}", this.Name, this.Age);
}
}
输出结果如下:

如果有参数,可以这样写:
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
//异步执行 传入一个people类型的参数,返回一个sting类型的结果
Func<people, string> FuncAsy = new Func<people, string>((pPeople) =>
{
return pPeople.Name;
}
);
FuncAsy.BeginInvoke(new people("异步小李", ), resual =>
{
//异步执行,从回调函数中获取返回结果
Console.WriteLine(FuncAsy.EndInvoke(resual));
Console.WriteLine("异步执行结束");
}, null);
//同步执行 传入一个string,int类型的参数,返回一个people类型的结果
Func<string, int, people> Func = new Func<string, int, people>((pName,pAge) =>
{
people tPeo = new people(pName, pAge);
return tPeo;
}
);
//同步执行,返回结果
Console.WriteLine(Func.Invoke("同步小李",).ToString());
Console.Read();
}
Func<T>与Action<T>委托泛型介绍的更多相关文章
- Func<T>与Action<T>委托泛型介绍:转
.Net 3.5之后,微软推出了Func<T>与Action<T>泛型委托.进一步简化了委托的定义. Action<T>委托主要的表现形式如下: public de ...
- 委托, 泛型委托,Func<T>和Action<T>
使用委托来做一些事情,大致思路是: 1.定义声明一个委托,规定输入参数和输出类型.2.写几个符合委托定义的方法.3.把方法列表赋值给委托4.执行委托 internal delegate int MyD ...
- C#委托的介绍(delegate、Action、Func、predicate)
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1.委托的声明 (1). delegate delegate我们常用到的一种声明 Deleg ...
- C#委托的介绍(delegate、Action、Func、predicate) --转载
来源:http://www.cnblogs.com/akwwl/p/3232679.html 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1 ...
- 【转】C# 委托的介绍(delegate、Action、Func、predicate)
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1.委托的声明 (1). delegate delegate我们常用到的一种声明 Delegat ...
- C#委托的介绍(delegate、Action、Func、predicate)(转)
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1.委托的声明 (1). delegate delegate我们常用到的一种声明 Deleg ...
- C#委托的介绍(delegate、Action、Func、predicate)【转】
转自 http://www.cnblogs.com/akwwl/p/3232679.html 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 1 ...
- C#委托的介绍(delegate、Action、Func、predicate)ga
转载:http://www.cnblogs.com/akwwl/p/3232679.html 感觉写的很好.例子也很简单明了.赞一个 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参 ...
- System.Func<>与System.Action<>
使用并行编程可以同时操作多个委托,在介绍并行编程前先简单介绍一下两个泛型委托System.Func<>与System.Action<>. Func<>是一个能接受多 ...
随机推荐
- laravel 中 与前端的一些事4 之合并压缩静态文件
合并压缩多个静态文件到一个文件里面,可以减少网站的http请求,稍微优化性能,提高网站的用户体验 使用elixir来实现: 敲命令 合并并压缩js和css文件
- 详解应对平台高并发的分布式调度框架TBSchedule
转载: 详解应对平台高并发的分布式调度框架TBSchedule
- NGINX 内存池有感
写在前面 写NGINX系列的随笔,一来总结学到的东西,二来记录下疑惑的地方,在接下来的学习过程中去解决疑惑. 也希望同样对NGINX感兴趣的朋友能够解答我的疑惑,或者共同探讨研究. 整个NGINX系列 ...
- 使用Chrome工具来分析页面的绘制状态
Chrome Canary(Chrome “金丝雀版本”)目前已经支持Continuous painting mode,用于分析页面性能.这篇文章将会介绍怎么才能页面在绘制过程中找到问题和怎么利用这个 ...
- 使用jQuery Mobile的注意事项(译)
翻译编辑自:http://www.appnovation.com/blog/7-things-know-about-jquery-mobile-working-it 一.Android和IOS的内置键 ...
- Props属性
大多数组件在创建时就可以使用各种参数来进行定制.用于定制的这些参数就称为props(属性). import React, { Component } from 'react'; import { Ap ...
- 使用 Hive 作为 ETL 或 ELT 工具
用来处理数据的 ETL 和 ELT 工具的概述 数据集成和数据管理技术已存在很长一段时间.提取.转换和加载(ETL)数据的工具已经改变了传统的数据库和数据仓库.现在,内存中转换 ETL 工具使得提取. ...
- Positive-definite kernel
Definition Let be a sequence of (complex) Hilbert spaces and be the bounded operators from Hi to Hj. ...
- HDU 4940 Destroy Transportation system(2014 Multi-University Training Contest 7)
思路:无源汇有上下界可行流判定, 原来每条边转化成 下界为D 上界为 D+B ,判断是否存在可行流即可. 为什么呢? 如果存在可行流 那么说明对于任意的 S 集合流出的肯定等于 流入的, ...
- JavaScript对象中的属性(可写,可配置,可枚举,value,getter,setter)
JavaScript中,对象包括3个特性,分别为,可扩展性,class标识符,属性. 如果对象的可扩展性为false,则不可为对象动态的添加属性. 对象包含分为存取器属性和值属性.存取属性为 {g ...