C#中的委托、lamba与Func Action的使用

xiaoxiao2021-02-28  119

概述委托声明方法绑定匿名委托方法绑定创建Lambda的委托创建泛型lambda委托

概述

在C#中委托作为一种类似于C++中函数指针的数据类型,允许开发开发人员将方法本身作为参数进行传递,极大地增加了函数功能的灵活性与可组装型。在C#中委托的实现方式,依据所使用的语法糖程度通常分为以下四种,在绝大部分的C#开发书籍中都只介绍了“委托申明+方法绑定”的基础调用形式,而在实际开发中,为了起到简化代码编写目的,常常使用其余三种方式,因此,本文对常用三种方式的特点进行了整理,并给出了使用Demo。

委托申明+方法绑定匿名委托+方法绑定匿名委托+Lambda绑定使用匿名委托对象Func和Action

委托声明+方法绑定

此种方式最为传统,写法最为复杂,没有多余的语法机制,比较方便理解。具体的操作流程为

graph LR 申明委托-->定义方法 定义方法-->创建委托对象并绑定方法 创建委托对象并绑定方法-->执行委托对象

注意:该种方式由于执行方法被分装在委托对象中,因此只能通过委托对象.invoke方法进行方法的调用

//声明委托 private delegate void Del_UpDateWaitFormDialog(WaitDialogForm dialog,int current,int count); //定义方法,即过程的执行体是一个方法,且有明确的方法名 private void UpDateWaitFormDialog(WaitDialogForm dialog,int current,int count) { string.Format("正在进行,已经完成 {0} / 10 ", (current + 1), count) } //方法绑定 Del_UpDateWaitFormDialog UpDateWaitFormDialog1= new Del_UpDateWaitFormDialog(UpDateWaitFormDialog); //其后可以如下执行方法,或者将其传递到需要使用委托的的方法中 UpDateWaitFormDialog1.invoke(实参列表);

匿名委托+方法绑定

此种方式最大的特点在于,委托中执行的方法由delegate修饰因而没有方法名

graph LR 申明委托-->定义匿名方法 定义匿名方法-->执行匿名方法

注意:该种方式的委托名就是访问执行体的唯一途径,非常类似于C++中的函数指针

//声明委托 private delegate void Del_UpDateWaitFormDialog(WaitDialogForm dialog,int current,int count); //定义匿名方法,即过程的执行体是一个方法,但是没有方法名 Del_UpDateWaitFormDialog UpDateWaitFormDialog1 = delegate(WaitDialogForm dialog,int current,int count) { string.Format("正在进行,已经完成 {0} / 10 ", (current + 1), count) } //其后可以如下执行方法,或者将其传递到需要使用委托的的方法中 UpDateWaitFormDialog1(实参列表);

创建Lambda的委托

此种方式与匿名委托没有太大差异,只是匿名委托的创建形式改为lambda表达式

graph LR 申明委托-->定义Lambda表达式 定义Lambda表达式-->Lambda表达式

注意:该种方式的委托名就是访问执行体的唯一途径,非常类似于C++中的函数指针

//声明委托 private delegate void Del_UpDateWaitFormDialog(WaitDialogForm dialog,int current,int count); //定义匿名lambda,即过程的执行体是lambda,且没有方法名 //由于执行体只有一行,因此可以删除花括号 Del_UpDateWaitFormDialog UpDateWaitFormDialog1 = (WaitDialogForm dialog,int current,int count) => string.Format("正在进行,已经完成 {0} / 10 ", (current + 1), count) //其后可以如下执行方法,或者将其传递到需要使用委托的的方法中 UpDateWaitFormDialog1(实参列表);

创建泛型lambda委托

该种方式不需要定义委托申明,并且可以通过lambda表达式直接创建匿名委托对于无返回值的方法,泛型委托为Action 若执行体只有一行,因此可以删除花括号 //直接定义无返回值类型的泛型委托Action //由于 Action<WaitDialogForm, int, int> updateaction = (dialog, current, count) => dialog.Caption = string.Format("正在进行,已经完成 {0} / 10 ", (current + 1), count); 泛型委托为Func,且参数列表中最后一个参数为返回值类型 参数列表中没有返回值类型的变量一定以return语句结束 //直接定义有返回值类型的泛型委托Action Func<WaitDialogForm, int, int,int> updateaction = (dialog, current, count) => { dialog.Caption = string.Format("正在进行,已经完成 {0} / 10 ", (current + 1), count); return 100; }
转载请注明原文地址: https://www.6miu.com/read-51899.html

最新回复(0)