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

概述

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

  1. 委托申明+方法绑定
  2. 匿名委托+方法绑定
  3. 匿名委托+Lambda绑定
  4. 使用匿名委托对象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委托

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

猜你喜欢

转载自blog.csdn.net/cyoubo/article/details/76769841