C# 实例详解委托之Func、Action、delegate(精品)
概述
委托是.NET编程的精髓之一,在日常编程中经常用到,在C#中实现委托主要有Func、Action、delegate三种方式,本节主要就这三种委托的用法通过实例展开讲解。
Func用法解析
【Func】:Func是带返回值的委托:
原型函数如下(以下展示的是有两个参数的情况):
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
用法举例1: 定义方法StringAddA
public int StringAddA(string a, string b) { return int.Parse(a) + int.Parse(b); }
定义委托func,然后把方法StringAddA委托给它,接下来执行委托并获取结果,注意:
Func<string, string, int> func = StringAddA;是Func<string, string, int> func = new Func<string, string, int>(StringAddA);的简写
Func<string, string, int> func = StringAddA;//简写 var result = func.Invoke("3", "5");//可以简化为func("3", "5") sw.AppendLine($"【func用法1】func返回结果是:{result}");
这里的执行结果是: 【func用法1】func返回结果是:8
用法举例2:
用lamda表达式简化写法,通过+=注册实现多播委托
func += (a, b) => { return int.Parse(a) - int.Parse(b); }; sw.AppendLine($"【func用法2】func返回结果是:{func("3", "5")}");
这里的执行结果是: 【func用法1】func返回结果是:-2
注意 += 可以注册多个委托,委托执行后会按顺序执行方法.
Action用法解析
【Action】:Action是无返回值的委托:
原型函数如下(以下展示的是有两个参数的情况):
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);
用法举例:
先定义方法:StringAddB
public void StringAddB(string a, string b) { sw.AppendLine($"【Action用法】Action执行结果:{(int.Parse(a) + int.Parse(b))}"); }
实例如下:
Action<string, string> action = StringAddB;//简写 IAsyncResult asyncResult = action.BeginInvoke("3", "5", , );//action("3", "5"),BeginInvoke异步执行,即:开启新现成处理StringAddB action.EndInvoke(asyncResult);//阻塞委托,直到执行完成 if (asyncResult.IsCompleted) { sw.AppendLine($"【Action用法】当前异步委托线程已执行完成"); }
这里BeginInvoke是异步委托,即新开线程去处理,我们的窗体线程在1号线程,这里我们可以在StringAddB里面打印线程id号
sw.AppendLine($"【Action用法】Action执行线程id:{Thread.CurrentThread.ManagedThreadId}");
运行结果:
【Action用法】Action执行线程id:3
这里的EndInvoke是阻塞委托,直到执行完成,当然我们这里也可以用同步的Invoke去执行,甚至Invoke都可以简写去掉,直接写成action("3", "5")
delegate用法解析
【delegate】:delegate是可以有返回值也可以没返回值的委托:
使用前需要先声明:
delegate int DelegateM(string a, string b);//声明,可以有返回值也可以没有
用法举例:
//delegate用法 //DelegateM delegateM = new DelegateM(p.StringAddA); DelegateM delegateM = StringAddA;//简写 sw.AppendLine($"【delegate用法】delegate返回结果是:{delegateM("3", "5")}");
以上就是三种委托的区别和用法讲解,那使用委托最大的优势是什么:
可以将方法当作参数去传递 ,用法举例如下:
Test(func, action);//将方法委托后转化为参数进行传递
定义方法
public void Test(Func<string, string, int> f, Action<string, string> a) { a.Invoke(f.Invoke("3", "5").ToString(), "5"); }
简单理解C#的Func委托
简单理解C# Func委托
方法如下:
没有输入参数,返回类型为TResult的方法:
Func<TResult>
有1个输入参数T1,返回类型为TResult的方法:
Func<T1, TResult>
有2个输入参数T1和T2,返回类型为TResult的方法:
Func<T1, T2, TResult>
有3个输入参数T1、T2和T3,返回类型为TResult的方法:
Func<T1, T2, T3, TResult>
……
有16个输入参数,返回类型为TResult的方法:
Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>
4、可以通过Lambda表达式、匿名方法或具名方法来创建Func委托的实例。
5、简单例子
//定义Func委托的实例add:将两个int类型的参数相加并返回一个int类型的结果
Func<int, int, int> add = (x, y) => x + y;
//调用委托
int result = add(2, 3); // result为5
总结
Func委托简洁灵活,可以用于封装各种具有返回值的方法,使得代码更加简洁和易于理解。
相关问答
func 是什么意思_作业帮[最佳回答]function的缩写,功能、函数的意思应该是自定义的函数名
c语言 func 函数?C语言程序中,func()指的是Function,表示子例程的一般性名词。在某些编程语言中,它指带返回值的子例程或语句。在一些编程语言中起着关键字的作用。将常用的代...
电脑平车上 FUNC 是什么意思?您好,电脑平车上FUNC是FUNC:function的简写功能的意思为驻车制动器指示。《GB4094汽车操纵件、指示器信号装置》规定(P)点亮时为红色,表示驻车制动器(手搂子...
Func 怎么用?Func是.netframework3.0后新加的泛型委托,可直接使用。最后一个占位标识,代表返回值类型,FuncFunc是.netframework3.0后新加的泛型委托,可直接使用。最后一....
laitz激光测距仪上边 func 是什么,怎么用?FUNC是功能按键,通过func按键可以切换面积、面积连加、体积、三角、双三角等功能。LAITZ激光测距仪可以切换5种单位,分别是米,英尺,英寸,英尺英寸,日尺。5...
c语言 func 的计算方法?func的计算方法可以通过定义一个函数,接收参数并进行相应的计算操作来实现。在C语言中,我们可以通过编写函数来实现func的计算,首先需要定义函数的返回类型和...
func 函数是干什么的?void是没有特定返回值的你应该知道吧func你应该是在C++语言教程中看到的吧,那是作者使用来举例或作语法演示的,没什么特别含义,就如”张三李四“一样!作...
func 函数怎么计算?试试下面这个#includevoidmain(void){doublefunc(int);doubles=0,term;inti;for(i=0,term=1;;i++){t...
全站仪 func 按钮起什么作用?ADP是英文Adapter/adaptor的缩写,是适配器的意思,也可以理解为扩展功能,多功能万用表会有ADP选购件,如电流分流器、温度适配器、交流钳形传感器等。当使用这...
func 里有几个形参?函数里可以有零个或多个形参,但是必须有返回值。函数里可以有零个或多个形参,但是必须有返回值。