Func与Action委托泛型介绍
来源:互联网 发布:网络摄像头怎么接线 编辑:程序博客网 时间:2024/04/30 12:12
Action委托主要的表现形式如下:
public delegate void Action(); public delegate void Action(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的定义形式上可以看到。Action是没有返回值得。适用于任何没有返回值得方法。例如:
/// /// 应用程序的主入口点。 /// [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表达式,可以更简练,对上面的代码,可以这样写:
/// /// 应用程序的主入口点。 /// [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可以这么做,例如:
/// /// 应用程序的主入口点。 /// [STAThread] static void Main() { //同步执行 传入一个参数 Action Action = new Action((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("小李",12,resual=>Console.WriteLine("异步执行结束"), null); Console.Read(); }
在上面代码中,同步定义的string类型,必须保证传入的参数a也是string。虽然并没有对a进行类型定义,但是系统默认就是事先泛型中定义的类型。类似的,异步委托也是一样。不然会报错。
Func委托主要的表现形式如下:
public delegate TResult Func(); 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委托的定义是相对于Action来说。Action是没有返回值得方法委托,Func是有返回值的委托。返回值的类型,由泛型中定义的类型进行约束。例如:
/// /// 应用程序的主入口点。 /// [STAThread] static void Main() { //异步执行 Func FuncAsy = new Func(() => { people tPeo = new people("异步小李", 10); return tPeo.ToString(); } ); FuncAsy.BeginInvoke(resual => { //异步执行,从回调函数中获取返回结果 Console.WriteLine(FuncAsy.EndInvoke(resual)); Console.WriteLine("异步执行结束"); }, null); //同步执行 Func Func = new Func(() => { people tPeo = new people("同步小李", 12); 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); } }
输出结果如下:
如果有参数,可以这样写:
/// /// 应用程序的主入口点。 /// [STAThread] static void Main() { //异步执行 传入一个people类型的参数,返回一个sting类型的结果 Func<people, string> FuncAsy = new Func<people, string>((pPeople) => { return pPeople.Name; } ); FuncAsy.BeginInvoke(new people("异步小李", 12), 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("同步小李",12).ToString()); Console.Read(); }
0 0
- Func与Action委托泛型介绍
- Func<T>与Action<T>委托泛型介绍
- Func<T>与Action<T>委托泛型介绍
- 泛型委托Action与func
- Action与Func委托
- 委托--Func与Action
- 学习笔记之Func<T>与Action<T>委托泛型介绍
- 泛型委托System.Func<>与System.Action<>
- 泛型委托 Predicate/Func/Action
- 泛型委托学习(Func和Action)
- C# 泛型委托 Action/Func
- 泛型委托 Predicate/Func/Action
- Action 和 Func 泛型封装委托
- 委托——Func与Action
- 泛型委托 Predicate/Func/Action ,c#扩展方法
- C#的泛型委托Predicate/Func/Action
- Action、Func、Predicate 和 Converter 泛型委托详解
- Action<T>和Func<T>泛型委托
- Mysql与Oracle区别
- empty、isset、isnull的区别
- phpMyAdmin查看创建表SQL语句的方法
- android Vulkan 图形新特性研究
- Android中静态方式破解某App实现所有视频app去除广告功能
- Func与Action委托泛型介绍
- 854计算机基础——《计算机组成原理》考点汇总(六) 指令系统
- Android Studio之dependencies
- Java并发包:ConcurrentMap
- MVC与MVVM区别?
- 黑色背景的DW代码配色方案 Colors.xml
- java中最常用jar包的用途说明,适合初学者
- av_seek_frame的调用
- 树莓派开机启动Qt程序